Hibernate HQL查询:如何在where子句中正确使用ANY函数?

时间:2010-07-16 16:47:40

标签: java hibernate hql

我很难理解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:意外的令牌::错误。

有什么想法吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

据我所知,= ANY相当于IN(我认为它们将被优化器转换为相同的查询)。从PostgreSQL文档:

  

9.16.4. ANY/SOME

expression operator ANY (subquery)
expression operator SOME (subquery)
     

右侧是带括号的   子查询,必须完全返回   一栏。左手表达   评估并与每行进行比较   使用给定的子查询结果   operator,必须产生一个布尔值   结果。 ANY的结果是“真实的”   如果获得任何真实结果。该   如果没有真实结果,则结果为“false”   发现(包括特殊情况   子查询没有返回行的地方。)

     

SOMEANY的同义词。 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节,   “比较函数和运算符”。