Hibernate Restrictions.in 与 Disjunction

Posted

技术标签:

【中文标题】Hibernate Restrictions.in 与 Disjunction【英文标题】:Hibernate Restrictions.in vs. Disjunction 【发布时间】:2011-08-19 15:29:09 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

休眠Disjunction用于

      Group expressions together in a single disjunction

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

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

【讨论】:

似乎第二种方法更简洁,不需要循环。不过,您的解释是有道理的。谢谢。 @sma:当我说前者时,我指的是我帖子中的第一个(Restrictions.in),而不是你的帖子:)【参考方案2】:

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+"%")));

【讨论】:

【参考方案3】:

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

将析取与零表达式结合使用会生成带有1=1 或等效项的有效 SQL 查询。

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

【讨论】:

以上是关于Hibernate Restrictions.in 与 Disjunction的主要内容,如果未能解决你的问题,请参考以下文章

Criteria查询

zabbix_get [2520]: Check access restrictions in Zabbix agent configuration

java ssh项目更新问题,先查询数据,然后进行更新操作,为啥保存不成功?下面有代码和控制台的一些信息

Hibernate→ 《Hibernate程序开发》教材大纲

hibernate问题

Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别