2012-12-21 141 views
10

我想使用“group by”编写条件查询并希望返回所有列。在休眠标准查询中选择“所有列”和“group by”

平面SQL是这样的:

select * from Tab group by client_name order by creation_time; 

我所知,这将有count(distinct client_name)的行数。

我这似乎并没有给予适当的结果当前的查询如下:

Criteria criteria = getSession(requestType).createCriteria(Tab.class); 
     criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name"))); 
     criteria.addOrder(Order.asc("creationTime")); 

此查询仅返回"client_name"。我不想手动放置所有列名称。必须有某种方式,可以做些什么?

+0

退房此链接:http://stackoverflow.com/questions/6678216/hibernate-select-all-projections-group-by – maximilianus

回答

1

我认为你误解了一些东西。如果您在SQL中使用GROUP BY,那么您需要按所有选定的列进行分组。这同样适用于休眠 - 如果groupPropertyProjection中,则表明Hibernate该列是组列。如果没有其他列/字段被引用,Hibernate会假设你不需要它们,因为它们也需要分组。

退一步:你想做什么?如果表中存在全部列中的重复数据,则可能是数据不正确,或者数据保存不正确。至少,你的钥匙会搞砸。

0

在hibernate for projection中,所有需要的列都需要添加到投影列表中。为了在实体中获得结果,我们必须使用setResultTransformer。检查下面的例子,以获得在休眠组:

ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.groupProperty("column1")); 
    projectionList.add(Projections.property("column2")); 
    projectionList.add(Projections.property("column3")); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class)); 
0

当使用hibernate投影时,您应该添加投影列表中所需的所有列。你只使用Projections.projectionList()。添加(Projections.groupProperty( “CLIENT_NAME”))

这一点。所以很显然,只返回client_name。