将hibernate投影映射到java POJO模型

时间:2013-05-24 08:08:21

标签: java spring hibernate hql pojo

过去几周我一直在使用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;
}

此处的问题是,我希望每个minYear的{​​{1}}(maxYear)在Person的最早年份(最近一年)填写有

后来我找到了使用cars的解决方案,但我偶然发现了Projections,这是db操作的代码:

org.hibernate.QueryException: could not resolve property: minYear of: model.Person

无论如何使用Criteria criteria = sessionFactory.getCurrentSession().createCriteria("model.Person"); criteria.add(create(personInstance)); criteria.createAlias("minYear", "minYear"); criteria.setProjection(Projections.min("cars.year").as("minYear")); 将聚合值存储在transient方法中,因为我只想尽可能避免使用普通的SQL和HQL。

1 个答案:

答案 0 :(得分:6)

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

  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();