我们说我有一个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 :(得分: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
。