Hibernate Restrictions.in vs. Disjunction

sma*_*sma 15 hibernate restrictions hibernate-criteria

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

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

VS.

Restrictions.in("code", stringArray);
Run Code Online (Sandbox Code Playgroud)

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

Nar*_*yan 15

Hibernate Disjunction习惯了

      Group expressions together in a single disjunction
Run Code Online (Sandbox Code Playgroud)

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

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


cha*_*kir 9

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

例如:

criteria.add(Restrictions.disjunction()
                        .add(Restrictions.eq("bill.stateCd", null))
                        .add(Restrictions.eq("bill.stateCd", ""))
                        .add(Restrictions.ilike("bill.stateCd","%"+stateCd+"%")));
Run Code Online (Sandbox Code Playgroud)

无法实现

criteria.add(Restrictions.in("bill.stateCd", Arrays.asList(null,"", "%"+stateCd+"%")));
Run Code Online (Sandbox Code Playgroud)