Hibernate JPA 动态criteria语句针对null查询条件的特殊处理

最近原Hibernate项目需要添加一个条件,结构有点类似下面的格式,学生和房间是多对一的关系,现在要查询所有没有房间的学生。

Class Student{

  @ManyToOne

  Room room;
}

 

一开始的查询语句是这样的:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
        Root<Student> root = criteriaQuery.from(Order.class);
        criteriaQuery.select(root);
    //多条件查询
        Predicate restrictions = criteriaBuilder.conjunction();
        //组合条件
       restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("room"), null));
        //将条件添加到查询
        criteriaQuery.where(restrictions);
        

发现项目查询时会报错,最后查询文档http://www.objectdb.com/java/jpa/query/jpql/literal#Criteria_Query_Literals_

发现在JPA动态查询时,条件全是Expression类型

所以不能直接使用null,而需要把null转换成Expression类型,语句如下:

restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("room"), criteriaBuilder.nullLiteral(Room.class)));

修改完查询正常

转载于:https://www.cnblogs.com/chenkeyu/p/9007626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值