Hibernate中可能用到两张(或更多)表映射称为复杂一点的对象的情形,例如每个User(用户)对象关联一个LoginInfo(登录信息)对象,LoginInfo还包括各种属性,例如LastLoginTime。
现在查询所有用户,hql为:
from User u如果按"User.LoginInfo.LastLoginTime"逆序排列,hql为:
from User u order by u.loginInfo.lastLoginTime desc
通常而言,两种方式,只是排序不同,结果数量是相同的。
但如果“user.loginInfo”为null了,使用有排序的hql,凡是user.loginInfo为null的数据都会被过滤掉无法查询到。
解决办法就是使用left join左连接LoginInfo。改造后的hql如下:
from User u left join u.loginInfo order by u.loginInfo.lastLoginTime desc
如果是用的org.hibernate.Criteria来进行查询,则排序时应调用三参数的createCriteria(String, String, int)方法,用CriteriaSpecification.LEFT_JOIN作为第三个参数值:
criteria.createCriteria("loginInfo", "login").addOrder(Order.asc("login.lastLoginTime"))
本文介绍在Hibernate中如何处理涉及两张或多张表映射的复杂对象查询,并解释了当需要按关联对象的属性进行排序时可能出现的问题及解决方案。
861

被折叠的 条评论
为什么被折叠?



