我有一个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”实体,它是否希望底层的功能具有独特性?似乎很浪费。
答案 0 :(得分: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
这可能会对你有所帮助。感谢。
答案 1 :(得分:0)
从未使用HQL,因为Biswas,我通常使用createCriteria,但如果查询返回域对象,并且您只想要不同的结果,您可能会尝试定义为Set而不是def,这将修复您将不会多次获得最终结果。
答案 2 :(得分: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();
}