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的主要内容,如果未能解决你的问题,请参考以下文章
zabbix_get [2520]: Check access restrictions in Zabbix agent configuration
java ssh项目更新问题,先查询数据,然后进行更新操作,为啥保存不成功?下面有代码和控制台的一些信息