Hibernate按login属性查询EstateAgent记录失败求助
问题排查与修复方案
嘿,我一眼就看出你这个getEstateAgentByLogin方法的核心问题啦!你用session.get(EstateAgent.class, login)来查询,但session.get()的第二个参数要求是实体的主键值,可你的EstateAgent主键是id(int类型),login只是普通的字符串属性,这就相当于拿着用户名去查用户ID,肯定查不到数据呀!
具体修复步骤
1. 重写查询方法
你需要改用HQL(Hibernate Query Language)来根据login这个普通属性查询,而不是用主键查询逻辑。下面是修正后的完整方法:
public EstateAgent getEstateAgentByLogin(String login) { Session session = sessionFactory.openSession(); Transaction tx = null; try{ tx = session.beginTransaction(); // 用HQL编写根据login查询的语句 String hql = "FROM EstateAgent ea WHERE ea.login = :login"; Query query = session.createQuery(hql); query.setString("login", login); // 登录名应该是唯一的,用uniqueResult获取单个结果 EstateAgent p = (EstateAgent) query.uniqueResult(); tx.commit(); return p; }catch(HibernateException e){ if(tx!=null) tx.rollback(); e.printStackTrace(); }finally{ session.close(); } return null; }
2. 确认Hibernate映射配置
另外要检查你的EstateAgent映射配置(XML或者注解),确保主键id被正确标记,login属性也正确映射到数据库字段:
- 如果是XML映射,大概是这样的结构:
<class name="de.dis2018.data.EstateAgent" table="estate_agent"> <id name="id" column="id"> <generator class="native"/> <!-- 主键生成策略,比如自增 --> </id> <property name="name" column="name"/> <property name="address" column="address"/> <property name="login" column="login"/> <property name="password" column="password"/> <!-- 关联estates的映射... --> </class>
- 如果用注解,记得在
id字段上加上@Id和@GeneratedValue注解,确保Hibernate能识别主键。
3. 验证登录逻辑
修改之后,你调用getEstateAgentByLogin("gary")就能正确获取到你用addTestData添加的Gary Oak实例了,之后命令行界面就能正常验证登录名和密码啦!
小补充
session.get()是专门用于主键查询的API,以后可别再用它查普通属性啦~- 因为登录名一般是唯一的,所以用
uniqueResult()获取单个结果非常合适,查不到的话会返回null,刚好匹配你当前方法的返回逻辑。
内容的提问来源于stack exchange,提问作者Hereks
相关产品推荐
相关产品推荐

