Hibernate的order by遇到null致数据丢失的问题

来源:互联网 发布:mac如何剪辑音频文件 编辑:程序博客网 时间:2024/05/17 07:44

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

0 0