【问题标题】:Hibernate Subqueries.notIn incorrectly excluding resultsHibernate Subqueries.notIn 错误地排除结果
【发布时间】:2013-02-01 19:41:18
【问题描述】:

在 Hibernate 方面我还比较陌生,但我面临调试一个看起来应该可以工作的 Criteria 查询。

数据结构大致如下:

User { Integer id, String type, String email, List<CustomerPolicy> policies, .... }  
CustomerPolicy { List<PolicyTable> tables, ... }  
PolicyTable { List<Insured> insureds, ... }  
Insured { Applicant applicant, ... }  
Applicant { String email, ... }  

我正在尝试获取用户链接的 CustomerPolicies 上所有申请人的电子邮件列表,除了那些与用户表中存在的电子邮件匹配的电子邮件。

这是我们在代码中的查询,它不起作用:

emails.addAll(User.createCriteria().list() { eq("id", id) eq(“类型”,“A”) createAlias(“政策”,“政策”) createAlias("policy.tables", "table") createAlias("table.insureds", "被保险人") createAlias("insured.applicant", "applicant") isNotNull("applicant.email") add(Subqueries.propertyNotIn("applicant.email", emailSubquery)) 预测{ 不同的(“申请人.email”) } }) emailSubquery = DetachedCriteria.forClass(User).setProjection(Projections.property("email"))

我有一个用户有大约 4 个保单,每个保单大约有 3-5 个表格,每个表格至少有一个投保人,其中大约一半的申请人有一封电子邮件,用户表 (alice@company.com) 和另一半的电子邮件不在 用户表 (foo@foo.com) 中。

使用 emailSubquery 后,没有任何电子邮件返回。删除子查询后,两者都返回。我已经验证 foo@foo.com 绝对不在 User 表中。

这个查询有什么问题?

【问题讨论】:

  • 看起来子查询没有延迟初始化。
  • Alice,您是否可能没有在列表操作之前定义 emailSubquery?在您的示例中,它是在列表操作之后定义的。有没有可能它之前定义为其他东西?
  • emailSubquery 实际上是一个方法调用,所以严格来说它不是预定义的。我刚刚尝试在 emails.addAll 之前将它分配给一个变量,但我仍然收到 0 封电子邮件。

标签: hibernate subquery hibernate-criteria


【解决方案1】:

我假设您正在使用 Oracle 进行此查询,这就是行为怪异的来源。

基本上,Oracle 为其 sql 执行提供了一个优化编译器。 this article 中很好地概述了“不在”、“不存在”和“左连接”的详细信息。

归结起来,使用 propertyNotIn 方法看不到任何结果的原因是“用户”表上的电子邮件属性包含空对象。这是an example,它为您提供的架构举例说明了这种行为。

更恰当地说,您要做的是使用 Subqueries.notExists 方法生成显示为here 的查询结果,这样即使在那个专栏。

最好的祝愿,希望这会有所帮助。

HT:SQL "select where not in subquery" returns no results

【讨论】:

  • 我之前遇到过令人讨厌的空对象问题,但在这里忘记了。我更新了分离标准以消除上面建议的空值并解决了问题。谢谢!
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多