Hibernate Criteria API中Restrictions.and()与Restrictions.conjunction()的区别
嘿,作为Hibernate新手,纠结这俩AND相关的方法太正常啦!我给你把它们的核心区别掰扯得明明白白~
Restrictions.and() vs Restrictions.conjunction() 的核心差异
1. 参数数量的灵活性
Restrictions.and()是个"死板"的二元操作:它只能接收2个Criterion参数,只能连接两个条件的AND关系。要是你需要连3个及以上的AND条件,就得一层层嵌套调用,写出来的代码会非常臃肿:Criteria criteria = session.createCriteria(User.class); // 三个条件需要嵌套两层and criteria.add(Restrictions.and( Restrictions.and(Restrictions.eq("name", "Alice"), Restrictions.gt("age", 18)), Restrictions.isNotNull("email") ));条件越多,嵌套层级越深,可读性和维护性越差。
Restrictions.conjunction()就灵活多了:它是个"容器式"的方法,你可以往里面添加任意多个Criterion,它会自动把所有条件用AND串联起来。写法清爽太多:Criteria criteria = session.createCriteria(User.class); Conjunction andConditions = Restrictions.conjunction(); andConditions.add(Restrictions.eq("name", "Alice")); andConditions.add(Restrictions.gt("age", 18)); andConditions.add(Restrictions.isNotNull("email")); criteria.add(andConditions);后续要加新条件?直接多一行
andConditions.add(...)就行,完全不用改原有结构。
2. 空条件的容错性
Restrictions.and()对null零容忍:如果你传了null作为参数,会直接抛出异常,必须保证两个参数都是有效的Criterion。conjunction()则很贴心:- 如果没添加任何条件,或者添加的全是null条件,它会生成一个永真条件(相当于SQL里的
WHERE 1=1),不会影响查询; - 如果部分条件是null,它会自动忽略这些无效条件,只把有效的条件用AND连接。
这在动态构建查询时特别实用——比如前端传来的可选筛选参数,不用挨个判断参数是否为空,直接往conjunction里加就行。
- 如果没添加任何条件,或者添加的全是null条件,它会生成一个永真条件(相当于SQL里的
3. 底层实现逻辑
简单来说:
and()就是单纯的二元AND操作符,底层直接生成两个条件的AND表达式;conjunction()是一个维护着Criterion列表的容器,生成SQL时会遍历列表,把所有有效条件用AND拼接起来。
直观对比看效果
比如要查询"名字为Alice、年龄>18、邮箱不为空、状态为激活"的用户:
- 用
and()需要嵌套3层,代码看着就头疼; - 用
conjunction()只需要连续调用4次add(),代码清晰到一眼就能看懂。
附上Hibernate官方API的截图,能更直观看到两者的定义:
内容的提问来源于stack exchange,提问作者Abhishek Attri
相关产品推荐
相关产品推荐

