2014-01-30 34 views
2

比方说,我们有2类这样的:使用Hibernate - 只获得指定的字段(按名称)

人:

@Entity 
@Table (name= "person") 
public class Person 
{ 
@Id 
@GeneratedValue 
@Column(name = "Id") 
private Long id; 

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

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

@OneToMany(mappedBy = "bank") 
private List<Bank> banks = new ArrayList<>(); 
} 

银行:

@Entity 
@Table(name = "bank") 
public class Bank { 

@Id 
@GeneratedValue 
@Column(name = "id") 
private Long id; 

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

@Columt(name = "phone") 
private String phone; 

@ManyToOne 
@JoinColumn(name = "client_id") 
@NotFound(action = NotFoundAction.EXCEPTION) 
private Person person; 
} 

我们希望能够得到只有某些领域:person.name,person.phone,person.bank.phone

我试图做这样的事情:

List result = session.createCriteria(Person.class) 
.setProjection(Projections.projectionList() 
.add(Projections.property("name")) 
.add(Projections.property("phone")) 
.add(Projections.property("banks.phone")) 
).list(); 

但最终我有此异常:

org.hibernate.QueryException: could not resolve property: banks.phone of: training.net5.Person 
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83) 
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:98) 
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:61) 
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1964) 
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:511) 
at org.hibernate.criterion.PropertyProjection.toSqlString(PropertyProjection.java:67) 
at org.hibernate.criterion.ProjectionList.toSqlString(ProjectionList.java:116) 
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getSelect(CriteriaQueryTranslator.java:379) 
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:110) 
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:92) 
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:97) 
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1651) 
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) 
at training.net5.MainClass.main(MainClass.java:82) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
could not resolve property: banks.phone of: training.net5.Person 

基本上所需要的是一种通过路径相对于根实体他们只得到某些字段。 所以我想知道如果我可以使用投影,或者我应该寻找另一种方法。

p.s.对不起我的英语我不是母语的人

+1

尝试在DAO使用简单的查询,而不是标准的,以获得记录,顺便说一句使用DAO的,我们可以使用实体名称为类名和字段名的数据成员便于阅读 – gks

回答

0

你想要得到的东西叫做fetch groups。如果你有一个包含许多列的表格,可能需要对它进行标准化,而不是使用这种技术。在你的代码banksOneToMany的关系。你在期待什么?

+0

我希望收集银行电话号码作为第三个对象。我有一个REST服务,客户可以给我一个他需要的字段列表。作为回应,我必须向他发送一个JSON。 – nikopol86

+0

也许你应该在@ banks上设置@OneToOne(fetch = FetchType.EAGER)。 – Mikhail

0

你可以尝试从其他实体开始?

List result = session.createCriteria(Bank.class) 
.setProjection(Projections.projectionList() 
.add(Projections.property("person.name")) 
.add(Projections.property("person.phone")) 
.add(Projections.property("phone")) 
).list(); 

也许应该

@OneToMany(mappedBy = "person") 
private List<Bank> banks = new ArrayList<>(); 
相关问题