【问题标题】:hibernate criteria group by sub-property休眠条件按子属性分组
【发布时间】:2012-12-21 00:16:44
【问题描述】:

假设如下:

public class Enterprise
{
   private int id;
   private String name;
}
public class Site
{
   private int id;
   private String name;
   private Enterprise enterprise; //@ManyToOne relation
}
public class Area
{
   private int id;
   private String name;
   private Site site; //@ManyToOne relation
}

我想通过企业使用休眠标准分组结果执行查询。

    Criteria criteria = session.createCriteria(Area.class);
    criteria.setProjection(Projections.projectionList()  
                    .add(Property.forName("id").as("id")) 
                    .add(Property.forName("name").as("name"))
        .add(Projections.groupProperty("site.enterprise")))
        .setResultTransformer(Transformers.aliasToBean(Area.class));
/*
 * more conditions
 */
    List<Area> areas = criteria.list();

执行此休眠时返回异常:org.hibernate.QueryException:无法解析属性:site.enterprise ...

有什么优雅的方法可以做到这一点。提前谢谢你。

【问题讨论】:

    标签: hibernate hibernate-criteria


    【解决方案1】:

    我相信你可能需要先设置别名:

    criteria.createAlias("site", "s")
    

    然后使用:

    Projections.groupProperty("s.enterprise")
    

    您可能还需要对字段而不是实体进行分组,因此:

    site.enterprise.name // or id
    

    这可能需要您也为enterprise 创建一个别名,但您可能不需要。

    更新 1:你可能会得到这样的结果:

    Criteria criteria = session.createCriteria(Area.class);
    criteria.createAlias("site", "s")
            .createAlias("s.enterprise", "e")
            .setProjection(Projections.projectionList()  
                    .add(Property.forName("id").as("id")) 
                    .add(Property.forName("name").as("name"))
        .add(Projections.groupProperty("s.e.name")))
        .setResultTransformer(Transformers.aliasToBean(Area.class));
    

    更新 2: 叫我疯了,但从上面的例子来看,你可能采取了一种非常冗长的方法,没有充分利用 Hibernate - 看起来你正在尝试使用它就像 SQL 一样。 Hibernate 已经知道您的实体、它们的字段和关系。在我看来,这相当于上面的:

    Criteria criteria = session.createCriteria(Area.class);
    criteria.createAlias("site", "s")
            .createAlias("s.enterprise", "e")
            .add(Projections.groupProperty("s.e.name"));
    
    // Any other conditions.
    
    List<Area> areas = criteria.list();
    

    我什至不确定你现在为什么要对它进行分组......

    【讨论】:

    • 嗨托尼!它完美地工作。我会将您的答案标记为有用,但我没有足够的声誉:) 谢谢
    • 很高兴它有效!您可以通过点击投票按钮下方的勾号来接受答案。
    • .add(Projections.groupProperty("s.e.name")) 你是如何在这里将 PropertyProjection 转换为 Criterion 的??
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多