【问题标题】:Map hibernate projections result to java POJO model将休眠投影结果映射到 java POJO 模型
【发布时间】:2013-05-19 18:51:44
【问题描述】:

在过去的几周里,我一直在使用 spring 和 hibernate,而且我一直在那里学习新东西。

现在我有一个问题想用 Hibernate 中的 Projections 解决。

假设有一个模型Person,并且该模型有很多Car。以下是类定义的大致样子:

public class Person implements java.io.Serializable {
    private Integer id;
    private String name;
    private List<Car> cars;
    private Integer minYear; // Transient
    private Integer maxYear; // Transient
}

public class Car implements java.io.Serializable {
    private Integer id;
    private Integer year;
}

这里的问题是我想让每个PersonminYear (maxYear) 由他们拥有的cars 的最早年份(最新年份)填充。

后来我找到了使用Projections的解决方案,但我偶然发现了org.hibernate.QueryException: could not resolve property: minYear of: model.Person,这是db操作的代码:

Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
            criteria.add(create(personInstance));
            criteria.createAlias("minYear", "minYear");
            criteria.setProjection(Projections.min("cars.year").as("minYear"));

有没有办法使用Projections 将聚合值存储在瞬态方法中,因为我只是想尽可能避免使用纯 SQL 和 HQL。

【问题讨论】:

    标签: java spring hibernate hql pojo


    【解决方案1】:

    没关系,我已经找到了解决方案。

    1. 首先我们需要像这样创建关联对象的别名

      Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person");
      criteria.createAlias("cars", "cars");
      
    2. 使用 Hibernate Projections 选择需要的

      ProjectionList projections = Projections.projectionList();
      projections.add(Projections.property("id").as("id"));
      projections.add(Projections.property("name").as("name"));
      projections.add(Projections.property("cars").as("cars"));
      
    3. 根据根实体对结果进行分组(在本例中使用其 id,Person.id),尤其是在与聚合一起使用以对聚合进行分组时需要这样做

      projections.add(Projections.groupProperty("id"));
      
    4. 使用聚合函数

      projections.add(Projections.min("cars.year").as("minYear"));
      projections.add(Projections.max("cars.year").as("maxYear"));
      
    5. 设置投影

      criteria.setProjection(projections);
      
    6. 使用结果转换器AliasToBeanResultTransformer 将结果字段(在步骤 2 和 4 中指定)映射到 POJO

      criteria.setResultTransformer(new AliasToBeanResultTransformer(Person.class));
      
    7. 得到结果

      List<Person> results = (List<Person>) criteria.list();
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多