【问题标题】:Hibernate HQL select distinctHibernate HQL 选择不同的
【发布时间】:2015-02-06 17:07:12
【问题描述】:

我有一个 HQL 查询,我需要在其中获得不同的结果。问题是我正在加入并急切地获取大量其他表,并且最终执行的底层 sql 查询在其中有不同,但是这些结果不可能是不同的,因为它正在选择所有列来自所有加入的实体。然后,Hibernate 似乎对返回的结果集执行了一些“魔术”,以确保我确实获得了我想要的实体的不同结果,但实际上在底层 SQL 查询上运行不同的结果似乎是浪费。查询类似于:

select distinct a from com.blah.A a
inner join fetch a.b b
inner join fetch b.r
left outer join fetch b.c
inner join fetch a.d
inner join fetch a.e

当然,这不是实际的查询,但它是我在做什么的模糊概念。即使当查询返回时 Hibernate 仍然需要进行一些过滤以确保我只获得不同的“A”实体,底层是否需要具有不同的功能?看起来很浪费。

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    我建议你使用任何一个

    1) 条件查询

    https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html

    2) Groovy SQL

    http://groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

    这可能会对您有所帮助。谢谢。

    【讨论】:

    • 我一开始尝试了条件路由,但它给出了相同的结果。在这种情况下,我希望避免编写纯 SQL,但看起来这可能是我最好的选择,因为 Hibernate 不给我做联合的能力。
    【解决方案2】:

    从未使用过 HQL ,因为 Biswas,我通常使用 createCriteria,但如果查询返回域对象,并且您只想要不同的结果,您可以尝试定义为 Set 而不是 def,这将解决您将不会多次得到最终结果。

    【讨论】:

    • 这肯定会消除代码中的重复项,但我遇到的问题是查询从数据库级别返回了如此多的行,因此很难对数据库征税。我希望在数据库级别而不是在代码中消除重复项。
    【解决方案3】:

    hibernate 中的Join 很简单,使用createAlias 和JoinType。 Distinct 有点棘手,我们必须对所有必需的字段使用投影,然后我们可以将 Projections.distinct 添加到应该是 distinct 的字段并对 bean 执行 resultTransform。在下面找到一个示例:

        Criteria criteria = getHibernateSession().createCriteria(A.class);
        criteria.createAlias("b", "b", JoinType.INNER_JOIN);
        criteria.createAlias("b.r", "b.r", JoinType.INNER_JOIN);
        criteria.createAlias("b.c", "b.c", JoinType.LEFT_OUTER_JOIN);
        ProjectionList projectionList = Projections.projectionList();
        projectionList.add(Projections.distinct(Projections.property("a")), "a");
        // ADD all the fields that u want in projection
        criteria.setProjection(projectionList);
        criteria.setResultTransformer(Transformers.aliasToBean(A.class));
        return criteria.list();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 2020-03-16
      • 2011-09-25
      • 2012-03-26
      • 1970-01-01
      • 2011-02-17
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多