除了更少的代码之外,使用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);
我问的原因是因为我在前者存在的情况下重构遗留代码,但我期待后者。如果它们都是相同的,我将单独保留遗留代码。
答案 0 :(得分:14)
Hibernate Disjunction用于
Group expressions together in a single disjunction
这意味着,如果您必须与值X或Y或Z 有条件地进行比较, 您可以迭代并应用selective disjunction
理想情况下,Restrictions.in和Restrictions.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方言可以处理它)语法错误。