簡體   English   中英

使用休眠-僅獲取指定的字段(按名稱)

[英]Using Hibernate - Get only specified fields (by name)

假設我們有2個這樣的類:

人:

@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

基本上,需要的是一種通過相對於根實體的路徑僅獲取某些字段的方法。 所以我想知道是否可以為此使用投影,還是應該尋找另一種方法。

ps對不起我的英語我不是母語

您可以嘗試從另一個實體開始嗎?

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<>();

您嘗試獲取的內容稱為獲取組 如果您的表包含許多列,則可能需要對其進行規范化,而不要使用此技術。 在您的代碼banks具有OneToMany關系。 你在期待什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM