Я пытаюсь найти пользователя в БД по имени пользователя вместо ID (который работает нормально). Но все, что я пытался, я не мог заставить его работать. Вот код
employee.hbm. xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="co.edureka.Employee" table="emp1">
<cache usage="read-only" />
<id name="empno" column="empno">
<generator class="assigned" />
</id>
<property name="ename" />
<property name="basic" />
<property name="hra" />
<property name="da" />
<property name="deduction" />
</class>
</hibernate-mapping>
ApplicationContext. xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:annotation-config/>
<!-- Initiate driver -->
<bean id="ds"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/edureka" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<bean id="mysessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="ds"></property>
<property name="mappingResources">
<list>
<value>employee.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="template" class="org.springframework.orm.hibernate5.HibernateTemplate">
<property name="sessionFactory" ref="mysessionFactory"></property>
</bean>
<bean id="empdao" class="co.edureka.EmployeeDAO">
<property name="template" ref="template" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="mysessionFactory"/>
</bean>
</beans>
Сотрудник. java
package co.edureka;
public class Employee {
private int empno;
private String ename;
private int basic, hra, da, deduction;
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(int empno, String ename, int basic, int hra, int da, int deduction) {
super();
this.empno = empno;
this.ename = ename;
this.basic = basic;
this.hra = hra;
this.da = da;
this.deduction = deduction;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public int getBasic() {
return basic;
}
public void setBasic(int basic) {
this.basic = basic;
}
public int getHra() {
return hra;
}
public void setHra(int hra) {
this.hra = hra;
}
public int getDa() {
return da;
}
public void setDa(int da) {
this.da = da;
}
public int getDeduction() {
return deduction;
}
public void setDeduction(int deduction) {
this.deduction = deduction;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Override
public String toString() {
return "Employee [empno=" + empno + ", ename=" + ename +", basic=" + basic + ", hra=" + hra + ", da=" + da + ", deduction="
+ deduction + "]";
}
}
Employee.DAO
package co.edureka;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;
public class EmployeeDAO {
private HibernateTemplate template;
public HibernateTemplate getTemplate() {
return template;
}
public void setTemplate(HibernateTemplate template) {
this.template = template;
}
@Transactional(readOnly = false)
public void saveEmployee(Employee emp) {
template.save(emp);
}
@Transactional(readOnly = false)
public void updateEmployee(Employee emp) {
template.update(emp);
}
@Transactional(readOnly = false)
public void deleteEmployee(Employee emp) {
template.delete(emp);
}
public Employee getByEmpno(int empno) {
Employee emp = (Employee)template.get(Employee.class, empno);
return emp;
}
public List<Employee> getEmployees(){
List<Employee> list = new ArrayList<Employee>();
list = template.loadAll(Employee.class);
return list;
}
}
Main. java
package co.edureka;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
EmployeeDAO dao = (EmployeeDAO)context.getBean("empdao");
//Employee emp2 = new Employee(105, "daddio Papo",75000, 15000, 18000, 5000 );
//dao.saveEmployee(emp2);
Employee emp4 =(Employee)dao.getByEmpno(101);
System.out.println(emp4);
List<Employee> emps = dao.getEmployees();
for(Employee semp : emps) {
System.out.println(semp);
}
}
}
Я пытался добавить этот метод в employeeDAO, чтобы получить сотрудника по имени, но, похоже, он не работает
public Employee getByEname(String ename) {
Employee emp = (Employee)template.find("FROM emp1 WHERE ename = '"+ename+"'"); // this is not working
return emp;
}
и это в основном. java
Employee emp3 =(Employee)dao.getByEname("Adrianne");
System.out.println(emp3);
Я получаю следующую ошибку трассировки стека
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: emp1 is not mapped [FROM emp1 WHERE ename = 'Adrianne']
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:138)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:722)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:110)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at org.springframework.orm.hibernate5.HibernateTemplate.lambda$find$30(HibernateTemplate.java:904)
at org.springframework.orm.hibernate5.HibernateTemplate.doExecute(HibernateTemplate.java:385)
at org.springframework.orm.hibernate5.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:351)
at org.springframework.orm.hibernate5.HibernateTemplate.find(HibernateTemplate.java:902)
at co.edureka.EmployeeDAO.getByEname(EmployeeDAO.java:52)
at co.edureka.EmployeeDAO$$FastClassBySpringCGLIB$$8fa4cd73.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:685)
at co.edureka.EmployeeDAO$$EnhancerBySpringCGLIB$$df7ce4c0.getByEname(<generated>)
at co.edureka.Main.main(Main.java:26)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: emp1 is not mapped [FROM emp1 WHERE ename = 'Adrianne']
at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:79)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:155)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:601)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:713)
... 16 more
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: emp1 is not mapped
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:169)
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:91)
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:79)
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:331)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3704)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3593)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:724)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:580)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:317)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:265)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:272)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192)
... 22 more
Я могу легко добавить и выполнить поиск по empno (первичный ключ). Я также могу получить список всех сотрудников из БД. Таким образом, таблица определенно сопоставлена. Метод, который я пытался использовать, чтобы получить ename, скорее всего неправильный, но я не уверен, что еще можно попробовать. Можно ли вообще выполнять поиск по ename, поскольку это свойство, а не первичный ключ?
Кроме того, это мой первый пост, надеюсь, то, что я спрашиваю, достаточно ясно. Если нет, пожалуйста, дайте мне знать, чтобы я мог добавить его.