HQL,我可以参数化 FROM 子句吗?

Posted

技术标签:

【中文标题】HQL,我可以参数化 FROM 子句吗?【英文标题】:HQL, can I parameterize the FROM clause? 【发布时间】:2014-06-26 10:13:42 【问题描述】:

我有这个 HQL 查询:

        Query q = em.createQuery (
        "DELETE FROM Annotation a WHERE a.id IN ( " +
        "  SELECT ja.id FROM :entityName an JOIN an.annotations ja)"
    );

我被告知:QuerySyntaxException:意外令牌::第 1 行附近 我有没有希望在 FROM 参数之后制作实体名称?我有一个要发送到此查询的实体列表,恐怕字符串连接太慢了。

【问题讨论】:

不,据我所知,不可能。您应该使用Criteria API 或构建查询字符串然后传递给方法。 谢谢sunisky。 Criteria 将是部分解决方案,因为似乎无法使用该 API 发出更新操作,但我可以将其拆分为 select+delete。构建字符串是我正在做的事情,但是 HQL 解析会使事情变慢。 【参考方案1】:

您不能将实体名称替换为实体属性的参数,而不是代替。

您可以通过一个查询选择要删除的实体 ID,然后将它们传递给第二个删除查询,但对于 READ_COMMITED 事务隔离,您可能仍会导致其他人插入一个与您的查询匹配的子实体。 SERIALIZABLE 将解决这个问题。

【讨论】:

问题是我有大量 Annotatable 的子类(具有'annotations'属性的子类)并且提前列出它们很难看(我希望在依赖包中扩展同一个类)。基本上,我意识到没有关系的东西对这些东西有好处,这是一种痛苦的方式。 有没有办法使用继承模型并将它们映射到同一个关联? 没有。这是一棵大树的***类,其中有几个 Annotatable 需要自己的映射表。由于性能原因,JOIN 映射也没有吸引力。我认为关系模型从根本上受限于这样的用例。

以上是关于HQL,我可以参数化 FROM 子句吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在选择子句中使用参数化列映射 iBATIS 查询?

使用 JDBC 参数化 IN 子句的最佳方法是啥? [复制]

参数化 PDO 查询和“LIMIT”子句 - 不起作用 [重复]

在 SPARK SQL 中参数化 Where 子句

使用 MySql、PHP 和 ADODB 在准备好的语句中参数化 IN 子句

PHP,Python中的Mysql IN子句参数化