在hibernate条件查询中选择“group by”的“all columns”

时间:2012-12-21 21:52:32

标签: java mysql hibernate group-by hibernate-criteria

我想使用“group by”编写条件查询,并希望返回所有列。

Plane 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"。我不想手动输入所有列名。必须有某种方式,可以做些什么?

4 个答案:

答案 0 :(得分:1)

我认为你误会了什么。如果在SQL中GROUP BY,则需要按所有选定的列进行分组。这同样适用于Hibernate - 如果groupProperty中的Projection,您告诉Hibernate该列是一个组列。如果没有引用其他列/字段,Hibernate将假定您不需要它们,因为它们也需要进行分组。

退后一步:你想做什么?如果表中的所有列之间存在重复数据,则可能包含错误数据或错误地保留数据。至少,你的钥匙会搞砸。

答案 1 :(得分: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));

答案 2 :(得分:0)

使用休眠投影时,您应该添加投影列表中所需的所有列。你只使用了Projections.projectionList()。add(Projections.groupProperty(“client_name”))

这个。所以很明显只返回client_name。

答案 3 :(得分:0)

不可能通过使用基于单个列的组来获取数据库的所有列。相反,您可以使用 group by子句中的所有列,也可以使用 select 中的所有列。要使结果进入休眠状态,如下所示

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