Java Hibernate投影-返回同一对象
假设我有一个人JPA实体: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() {};
@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