【问题标题】:select "all columns" with "group by" in hibernate criteria queries在休眠条件查询中选择“所有列”和“分组依据”
【发布时间】:2012-12-09 11:29:10
【问题描述】:

我想使用“分组依据”编写条件查询并希望返回所有列。

平面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"。我不想手动放置所有列名。一定有什么办法,有什么办法?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在投影的休眠中,所有需要的列都需要添加到投影列表中。要在实体中获取结果,我们必须使用 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));
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-03-30
          • 1970-01-01
          • 2011-10-04
          • 2013-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-08
          相关资源
          最近更新 更多