12

我想使用“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"仅返回。我不想手动放置所有列名。一定有办法,有什么办法?

4

4 回答 4

0

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

退后一步:你想做什么?如果您在表中的所有列中都有重复的数据,则您可能有错误的数据,或者不正确地保存数据。至少,你的钥匙会被弄乱。

于 2012-12-23T15:00:47.863 回答
0

在投影的休眠中,需要将所需的所有列添加到投影列表中。要在实体中获取结果,我们必须使用 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));
于 2015-04-16T14:43:41.430 回答
0

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

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

于 2015-04-17T04:40:53.560 回答
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"));
于 2020-06-02T13:44:17.273 回答