比方说,我们有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.对不起我的英语我不是母语的人
尝试在DAO使用简单的查询,而不是标准的,以获得记录,顺便说一句使用DAO的,我们可以使用实体名称为类名和字段名的数据成员便于阅读 – gks