17

除了更少的代码之外,以下两种使用 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);

我问的原因是因为我正在重构前者存在的遗留代码,但我期待后者。如果它们都相同,我将不理会遗留代码。

4

3 回答 3

17

休眠析取用于

      Group expressions together in a single disjunction

这意味着,如果您必须有条件地与值 X OR Y OR Z 进行比较,您可以迭代并应用选择性析取

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

于 2011-05-05T20:09:56.770 回答
11

Restrictions.Disjunction 为我们提供了显式控制,例如它允许 like 运算符,而 as in 运算符则不允许。

例如:

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

不能用 in 来实现

criteria.add(Restrictions.in("bill.stateCd", Arrays.asList(null,"", "%"+stateCd+"%")));
于 2014-04-15T20:11:43.520 回答
3

stringArray使用给定的代码,当元素为零时,这两者的行为非常不同。

使用 Disjunction 和零表达式会产生有效的 SQL 查询1=1或等效查询。

Restrictions.in导致 IN 运算符没有值,这通常(也许某些 SQL 方言可以处理它)在语法上不正确。

于 2014-06-05T19:15:09.280 回答