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