Hibernate:在子选择查询中使用 IN 子句时出现错误

Posted

技术标签:

【中文标题】Hibernate:在子选择查询中使用 IN 子句时出现错误【英文标题】:Hibernate : stange error when using the IN clause in sub select query 【发布时间】:2017-04-14 09:25:13 【问题描述】:

使用休眠 4.3.11.final.

我们使用 @Query 注释发出请求,其中我们在子选择查询 ex 中使用 in 子句:

select distinct doc from DocumentType doc join doc.usages u where u.institute not in :institutes and doc.id not in (select distinct doc1.id from DocumentType doc1 join doc1.usages u1 where u1.institute in :institutes)

第一个 in 子句正确生成(添加了括号),但子选择中的那个不是。

生成的sql是:

select distinct doc from fr.itce.pen.model.customer.folder.DocumentType doc join doc.usages u where u.institute not in (:institutes_0_, :institutes_1_) and doc.id not in (select distinct doc1.id from fr.itce.pen.model.customer.folder.DocumentType doc1 join doc1.usages u1 where u1.institute in :institutes_0_, :institutes_1_)]

一种解决方法是在声明的查询中用括号将部分括起来:

select distinct doc from DocumentType doc join doc.usages u where u.institute not in :institutes and doc.id not in (select distinct doc1.id from DocumentType doc1 join doc1.usages u1 where u1.institute in (:institutes))

有没有更好的方法让它工作,和/或在最近的休眠版本中修复了这个“错误”?我查看了休眠问题,但找不到有关此行为的任何信息。

最好的问候。

【问题讨论】:

在我看来我被hibernate.atlassian.net/browse/…咬了 【参考方案1】:

也许这是一个错误,但不会在 4.3 中修复。

您需要使用测试用例在 5.2 上复制它并打开 Jira 问题。

【讨论】:

嗯,我们将 List 传递给请求,所以我想我们尊重这方面,但也许我不理解你的回答。【参考方案2】:

这是一个错误,已在 hibernate 5.2 中更正。

【讨论】:

以上是关于Hibernate:在子选择查询中使用 IN 子句时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Hibernate 3.2.2 的本机 sql 查询中使用 IN 子句

sql面试题_SQl优化技巧_1注意通配符中like的使用,百分号放后面_2避免在where子句中对字段进行函数操作_3在子查询当中,尽量用exists代替in_4where子句中尽量不要使用(代码片

如何在子查询的 WHERE 子句中使用来自 UNNEST 的多个值?

Oracle In子句

如何保持 Spring Data JPA 或 Hibernate 中“in”子句中提供的顺序 [重复]

在本机 sql 查询中使用 IN 子句