首页 文章

Hibernate HQL选择截然不同

提问于
浏览
0

我有一个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”实体,它是否希望底层的功能具有独特性?似乎很浪费 .

3 回答

  • 0

    我建议你使用其中之一

    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

    这可能对你有帮助 . 谢谢 .

  • 0

    从未使用HQL,因为Biswas,我通常使用createCriteria,但如果查询返回域对象,并且您只想要不同的结果,您可能会尝试定义为Set而不是def,这将修复您不会得到多个最后结果的时间 .

  • 0

    连接在hibernate中非常简单,使用createAlias和JoinType . 不同之处有点棘手,我们必须对所有必填字段使用投影,然后我们可以将Projections.distinct添加到应该是不同的字段并将resultTransform添加到bean . 在下面找一个例子:

    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();
    }
    

相关问题