2012-08-01 110 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