我正在努力理解我在HQL查询中的错误:
public List<Pats> getIds(List<String> patIds) {
Session session = getSession();
String hql = "from OurPats where patId = any (:patIds)";
// String hql = "from OurPats where patId in (:patIds)";
return session.createQuery(hql).setParameterList("patIds", patIds).list();
}
字符串
...注解出来的行可以正常工作,但是我希望不工作的ANY比较的功能是patIds.size()可以大于2^15(导致postgresql中断)。
从http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html判断,ANY函数应该可以工作。在其他论坛的问题中,人们说不要使用上面链接中规定的元素函数(我已经尝试使用元素,我得到了一个IDENT错误)。上面的代码产生一个org.hibernate.hql.ast.QuerySyntaxException:意外令牌::error.
有什么想法吗?谢谢帮忙。
2条答案
按热度按时间llycmphe1#
据我所知,
= ANY
等价于IN
(我认为它们将被优化器转换为相同的查询)。PostgreSQL文档:9.16.4.任何/一些
字符串
右边是一个带括号的子查询,它必须返回一列。使用给定的
operator
对左边的表达式进行计算并与子查询结果的每一行进行比较,这必须产生一个布尔结果。ANY
的结果为“true”,如果得到任何true结果。如果没有找到true结果(包括子查询不返回行的特殊情况),则结果为“false”。SOME
是ANY
的同义词。IN
相当于= ANY
。所以我不认为使用
= ANY
将解决您的问题。当然,我没有上下文,但你确定执行超过2^15
OR
的比较真的有意义吗?hi3rlvi22#
我不知道你说的“任何”而不是“在”的功能是什么意思。我知道的每个DBMS都把它们当作同义词。
= ANY不允许用于MySQL中的列表,只允许用于子查询。表面上,你把你的方言设置为MySQL,Hibernate知道这一点?
http://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html
与表达式列表一起使用时,IN和= ANY不是同义词。IN可以接受表达式列表,但= ANY不能。请参见第11.3.2节“比较函数和运算符”。