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 子句吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JDBC 参数化 IN 子句的最佳方法是啥? [复制]
参数化 PDO 查询和“LIMIT”子句 - 不起作用 [重复]