Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate投影-返回同一对象_Java_Hibernate_Jpa - Fatal编程技术网

Java Hibernate投影-返回同一对象

Java Hibernate投影-返回同一对象,java,hibernate,jpa,Java,Hibernate,Jpa,假设我有一个人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() {};

假设我有一个人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() {};
}
使用条件查询,是否可以检索列表,但只包含每个人的姓名

看看,我发现有一种方法

我认为我可以将结果转换为只包含名称的ReducedPerson类。但是,我只想选择人物的名字,但仍然要取回人物对象


这可能吗?

如果您是正确的,您需要设置一个结果变压器。据我所知,在hibernate的这个领域,这并不多,hibernate提供的转换器是严格的,如果缺少一个值,就会失败,因此我认为您需要创建自己的ResultTransformer实例。我建议查看AliasToBeanResultTransformer中的代码,并制作一个宽松的版本。

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

您可以使用查询返回的现有Person类实例,当然,这些实例是非托管的,但是需要使用一个名为的构造函数

SELECT NEW sample.Person(p.name) FROM Person p 
单投影

您可以像这样使用现有的ResultTransformer

Criteria query = session.createCriteria(Person.class)
  .setProjection(Projections.property("name").as("name"))
  .setResultTransformer(Transformers.aliasToBean(Person.class));
List personNames = query.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