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"))