java - Spring-Hibernate 模板 - 是否可以通过用户名(属性之一)而不是通过 id(主键)在数据库中搜索用户?

标签 java hibernate

我试图通过用户名而不是 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 + "]";
    }
}

员工.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;
    }

这在 main.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 进行搜索,因为它是一个属性而不是主键?

这也是我第一次发帖,希望我的问题足够清楚。如果没有,请告诉我,以便我添加。

最佳答案

Employee emp = (Employee)template.find("FROM emp1 WHERE ename = '"+ename+"'");

emp1是表名,这里需要指定实体名称Employee

尝试:

 Employee emp = (Employee)template.find("FROM Employee WHERE ename = '"+ename+"'");

关于java - Spring-Hibernate 模板 - 是否可以通过用户名(属性之一)而不是通过 id(主键)在数据库中搜索用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60271060/

相关文章:

mysql - 出现错误 'java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String'

hibernate - NHibernate 中 ISession.Save/Update 和 ITransaction.Commit 的区别

java - 我需要使用 Spring Security OAuth2 的资源服务器吗?

java - 如何生成 10 到 99 之间的 50 个随机数,不重复。

java - 如何在不必实现接口(interface)方法的情况下使用它们?

数据库系统的JAVA桌面应用程序

Hibernate 分布式缓存 - 多个应用程序可以共享同一个缓存吗?

java - 用于动态表创建的 hibernate

java - 通过 Hibernate 从 SQL 数据库中获取随机对象

java - 在 Android 中,当应用程序首次在手机上启动时, Activity 前会出现白屏