在Hibernate Criteria Query中选择带有“GROUP BY”的“所有列”

vom3gejh  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(323)

我希望使用“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"。我不想手动放置所有列名。一定有办法,能做些什么呢?

hivapdat

hivapdat1#

我想你一定是误会了。如果在SQL中使用GROUP BY,则需要按所有选定列进行分组。同样的道理也适用于Hibernate--如果您在Projection中使用groupProperty,那么您就是在告诉Hibernate该列是一个组列。如果没有引用其他列/字段,Hibernate将假定您不需要它们,因为它们也需要分组。
退后一步:你想做什么?如果表中的所有列存在重复数据,则可能存在错误数据,或者持久化数据不正确。至少,你的钥匙会被弄乱。

pgky5nke

pgky5nke2#

在Hibernate for Projects中,需要的所有列都需要添加到投影列表中。要获得Entity中的结果,我们必须使用setResultTransformer。选中下面的示例以在Hibernate中获取GROUP BY:

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));
6mzjoqzu

6mzjoqzu3#

当使用Hibernate投影时,您应该添加投影列表中需要的所有列。您只使用了Projections.projectionList().add(Projections.groupProperty(“client_name”))
这个。因此很明显,只返回CLIENT_NAME。

7hiiyaii

7hiiyaii4#

不可能通过使用基于单个列的组来获取数据库的所有列。相反,您可以根据需要使用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"));

相关问题