2012-08-01 112 views
0

我有這樣一個實體模型:Hibernate查詢多個對象選擇

public class Facture implements Serializable 
{ 
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_FACTURE") 
private long idFacture; 
... 

private Panier panier; 
    ... 
} 

public class Panier 
{ 
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_PANIER") 
private long idPanier; 

@ManyToOne 
private Client client; 
@OneToMany 
private List<LignePanier> articles = new ArrayList<LignePanier>(); 
... 
} 

public class Client 
{ 
@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_CLIENT") 
private long idClient; 
... 
    } 

所以我想從一個客戶端X. 查詢所有骨折我嘗試這樣:

public List<Facture> listeFacture(Long clientID) { 
    List<ParameterMap> parameters = new ArrayList<ParameterMap>(); 
    parameters.add(new ParameterMap(StandardBasicTypes.LONG, clientID)); 
    return dao.query("select facture from Facture facture where facture.panier.client.idClient = ?", parameters); 
} 

我得到這個異常:

org.hibernate.QueryException: could not resolve property: client of: be.infoserv.web.model.Facture [select facture from be.infoserv.web.model.Facture facture where facture.panier.client.idClient = ?] 

我認爲這是不可能的查詢穿透式對象像這個,但我不知道如何寫這個查詢...

對不起,我是一個法國用戶。

+0

你有適當的吸氣劑和安裝者到位? – SiB 2012-08-01 18:58:32

+0

是的,我有所有的getter和setter到位 – Paca 2012-08-01 19:15:25

回答

1

您可能需要使用內部連接要做到這一點:

select facture 
from Facture facture 
    inner join facture.panier as panier 
    inner join panier.client as client 
where client.clientId = ? 

或者使用標準它可以是一個比較安全,因爲你不能弄髒的HQL:

Criteria factureCrit = session.createCriteria(Facture.class); 
Criteria panierCrit = factureCrit.createCriteria("panier"); 
Criteria clientCrit = panierCrit.createCriteria("client"); 
clientCrit.add(Restrictions.idEq(clientId)); 

return factureCrit.list(); 
+0

我認爲你的想法很好,但我有這個異常,當我在查詢中使用連接...愚蠢的休眠xD! 顯示java.lang.NullPointerException \t在org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:396) \t在org.hibernate.hql.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3671) – Paca 2012-08-02 09:46:53

+0

你也可以嘗試「內部連接抓取」,這可能會有所幫助。但這個想法是一樣的。我一直都在使用這個構造。但是,使用標準查詢可能會更好。請參閱編輯 – Matt 2012-08-02 12:16:49

+0

感謝您的幫助,當我在班級製作中的@manyToOne映射時,您的所有解決方案都可以工作!但我不想要這種映射,因爲我想凍結我的賬單狀態。 所以我最終做它programmaticaly不太好,但它的作品。 我將你的回答標記爲答案;) – Paca 2012-08-03 10:10:45