Hibernate Restrictions.in vs. Disjunction

时间:2011-05-05 18:42:43

标签: hibernate hibernate-criteria restrictions

除了更少的代码之外,使用Hibernate Criteria API构建IN子句的以下两种方法之间的区别是什么?是否存在性能问题?我缺少的检索中是否有一些逻辑?就返回的行而言,它们似乎都表现相同。

Disjunction disj = Restrictions.disjunction();
for (String value : stringArray) {
     disj.add(Restrictions.eq("code", value));
}
where.add(disj);

VS

Restrictions.in("code", stringArray);

我问的原因是因为我在前者存在的情况下重构遗留代码,但我期待后者。如果它们都是相同的,我将单独保留遗留代码。

3 个答案:

答案 0 :(得分:14)

Hibernate Disjunction用于

      Group expressions together in a single disjunction

这意味着,如果您必须与值X或Y或Z 有条件地进行比较, 您可以迭代并应用selective disjunction

理想情况下,Restrictions.inRestrictions.Disjunction做同样的事情,在这种情况下,我更喜欢前者。

答案 1 :(得分:8)

Restrictions.Disjunction为我们提供了明确的控制,例如它允许类似运算符,而在运算符中则不允许。

例如:

criteria.add(Restrictions.disjunction()
                        .add(Restrictions.eq("bill.stateCd", null))
                        .add(Restrictions.eq("bill.stateCd", ""))
                        .add(Restrictions.ilike("bill.stateCd","%"+stateCd+"%")));

无法实现

criteria.add(Restrictions.in("bill.stateCd", Arrays.asList(null,"", "%"+stateCd+"%")));

答案 2 :(得分:3)

使用给定的代码,当stringArray确实没有元素时,这两个代码的表现非常不同。

将Disjunction与零表达式一起使用会产生1=1或等效的SQL查询。

Restrictions.in导致IN运算符没有值,这通常(可能是某些SQL方言可以处理它)语法错误。