我很难理解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判断,任何函数都应该起作用。在其他论坛问题中,人们说不要使用上面链接中规定的元素功能(我尝试过元素,我得到IDENT错误)。上面的代码产生了一个org.hibernate.hql.ast.QuerySyntaxException:意外的令牌::错误。
有什么想法吗?谢谢你的帮助。
答案 0 :(得分:2)
据我所知,= ANY
相当于IN
(我认为它们将被优化器转换为相同的查询)。从PostgreSQL文档:
9.16.4. ANY/SOME
expression operator ANY (subquery) expression operator SOME (subquery)
右侧是带括号的 子查询,必须完全返回 一栏。左手表达 评估并与每行进行比较 使用给定的子查询结果
operator
,必须产生一个布尔值 结果。ANY
的结果是“真实的” 如果获得任何真实结果。该 如果没有真实结果,则结果为“false” 发现(包括特殊情况 子查询没有返回行的地方。)
SOME
是ANY
的同义词。IN
是 相当于= ANY
。
所以我认为使用= ANY
无论如何都不会解决您的问题。
当然,我没有上下文,但你确定执行超过2 ^ 15 OR
比较真的有意义吗?
答案 1 :(得分:0)
不确定你想要'any'的功能而不是'in'是什么意思。我知道的每个DBMS都将它们视为同义词。
= MySQL中的列表不允许任何内容,仅适用于子查询。表面上你把你的方言设置为MySQL而Hibernate知道这个吗?
http://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html
IN和= ANY不是同义词 与表达式列表一起使用。 IN可以 拿一个表达式列表,但是= ANY 不能。见11.3.2节, “比较函数和运算符”。