【问题标题】:distinct inner join hql不同的内连接 hql
【发布时间】:2012-05-11 14:05:13
【问题描述】:

我有以下休眠实体

public class Container {
  ...

  @OneToMany
  private List<ACLEntry> aclEntries;
}

为了保护我的容器实例,我使用以下实体:

public class ACLEntry {

  ...
  private Long sid;
  private boolean principal;
  private Integer mask;

}

hql 查询将自动创建,以便搜索容器实例, 将创建以下查询:

select container from Container container 
inner join container.aclEntries as aclEntry 
with bitwise_and (aclEntry.mask, 1) = 1 and 
   (aclEntry.sid = :userId or aclEntry.sid = :roleId)  

这样做的问题是,aclentry 连接可能会返回 2 个结果,这将导致重复的容器结果。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    据我了解,您需要一个可以容纳 Container 对象的多个条目的容器,只需将您的 hql 查询替换为以下内容即可:

    添加select distinct 作为本机查询。

    【讨论】:

    • 我们使用内部查询引擎来构建 hql 查询,所以我不能添加 distinct,因为它会影响所有查询。我认为 distinct 应该只应用于连接,还是我错了?
    • +1。这是正确且简单的解决方案。如果查询引擎不能处理,那就改进查询引擎。
    【解决方案2】:

    作为蛮力解决方案,您可以编写本机查询。

    【讨论】:

    • 我们正在使用内部查询引擎来构建我们的 hql 查询,如果更改为原生查询,我们将不得不更改我们的查询引擎
    【解决方案3】:

    将其编写为 Criteria 查询可能更有意义,easily supports selecting an object based on conditions of it's associations

    同样的事情可以在 HQL 或原生查询中完成,执行指定相同逻辑的 Criteria 查询并查看它生成的 HQL/SQL 可能是有益的。

    【讨论】:

    • 如文档中所述,标准 api 将执行两个查询,然后在第三步中加入结果;我认为对于这种情况,它对于获取大型结果集的性能不够,还是我错了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2016-12-27
    • 2013-02-10
    • 1970-01-01
    • 2013-04-21
    • 2019-07-13
    相关资源
    最近更新 更多