Hibernate Projection - 获取同一对象

时间:2014-11-22 04:39:24

标签: java hibernate jpa

我们说我有一个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个对象。

这可能吗?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用构造函数表达式执行此操作:

http://en.wikibooks.org/wiki/Java_Persistence/JPQL#Constructors

您可以使用现有的Person类(当然,您的查询返回的实例是非托管的),但是需要使用名称的构造函数。

SELECT NEW sample.Person(p.name) FROM Person p 

答案 2 :(得分: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对象。有条不紊地,您还希望至少为这些人检索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