【问题标题】:Hibernate HQL Query : How to properly use ANY function in where clause?Hibernate HQL 查询:如何在 where 子句中正确使用 ANY 函数?
【发布时间】:2010-07-16 16:47:39
【问题描述】:

我很难理解我在 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: unexpected token: : error。

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

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    据我所知,= ANY 等价于IN(我认为优化器会将它们转换为相同的查询)。来自 PostgreSQL 文档:

    9.16.4. ANY/SOME

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

    右边是括号 子查询,必须准确返回 一栏。左边的表达式 被评估并与每一行进行比较 使用给定的子查询结果 operator,它必须产生一个布尔值 结果。 ANY 的结果是“真” 如果得到任何真实的结果。这 如果没有真正的结果,则结果为“假” 发现(包括特殊情况 其中子查询不返回任何行)。

    SOMEANY 的同义词。 IN 是 相当于= ANY

    所以我认为使用= ANY 无论如何都不会解决您的问题。

    当然,我没有上下文,但你确定执行超过 2^15 次OR 比较真的有意义吗?

    【讨论】:

      【解决方案2】:

      不知道你想要'any'而不是'in'的功能是什么意思。我认识的每个 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 节, “比较函数和运算符”。

      【讨论】:

      • 我用的是PostgreSQL,所以bit.ly/9ObRdJ比较合适。这让我看了……“表达式 IN (value [, ...]) 右侧是一个带括号的标量表达式列表。” “表达式运算符 ANY(数组表达式)右侧是带括号的表达式,它必须产生一个数组值。”也许如果我修改这个: return session.createQuery(hql).setParameterList("patIds", patIds).list();对此:返回 session.createQuery(hql).setParameterList("patIds", patIds.toArray()).list(); ......它会工作吗?没有。同样的错误。嗯
      • 呵呵,不知道我是怎么想到 mySQL 的,一定是同时读了两页。也许你的方言没有设置为 postgres 并且休眠不知道做时髦的 ARRAY['foo','bar'] 事情?您可以将 hibernate.show_sql 属性设置为 true 或打开包 org.hibernate.SQL 的日志记录以进行调试以查看它实际发送到 postgres 的内容
      猜你喜欢
      • 2015-12-31
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多