2014-11-22 77 views
0

比方说,我有一个Person JPA实体:休眠投影 - 又回到同一个对象

@Entity 
public class Person { 

    @Id 
    private Long id; 

    @Column(name="name") 
    private String name; 

    @Column(name="age") 
    private Integer age; 

    @Column(name="hobbies") 
    private List<String> hobbies; 

    public Person() {}; 
} 

使用Criteria Query,是有可能检索List<Person>,但只包括各Person叫什么名字?

看着Java Persistence with Hibernate,我看到有一个Criteria#setResultTransformer方法。

我认为我可以将结果转换为只包含名称的ReducedPerson类。但是,我想选择只有Person的名字,但仍然得到Person对象回来。

这可能吗?

回答

0

你是对的,你需要设置一个ResultTransformer。对于我所知道的这个hibernate领域来说,这并不是很多,Hibernate提供的转换器是严格的,如果缺少一个值就会失败,所以我认为你需要创建你自己的ResultTransformer的实例。我建议看看AliasToBeanResultTransformer的代码,并制作一个宽松的版本。

0

单个投影

您可以使用现有的ResultTransformer这样

Criteria query = session.createCriteria(Person.class) 
    .setProjection(Projections.property("name").as("name")) 
    .setResultTransformer(Transformers.aliasToBean(Person.class)); 
List personNames = query.list(); 

多个投影

的例子List上面现在包含有他们的名字只有Person对象。 Regullary,您还希望至少为人员检索id。您可以在此方法中,该

ProjectionList colProjection = Projections.projectionList(); 
colProjection.add(Projections.property("id"), "id"); 
colProjection.add(Projections.property("name"), "name"); 
Criteria query = session.CreateCriteria(Person.class) 
    .setProjection(colProjection) 
    .setResultTransformer(Transformers.aliasToBean(Person.class)); 
List persons = query.list(); 

主要设置多个属性是设置相同的别名原来的属性名称,所以我们不需要建立自己的ResultTransformer