Bonjour
Je débute avec hibernate, et il m'arrive un truc bizarre.
J'ai deux tables produit et prix, un produit pouvant avoir plusieurs prix (1-n)
Je dois faire une requête avec des critères portant à la fois sur le produit et sur le prix.
Vu le nombre de résultats renvoyés, il serait plus rentable que hibernate récupère les objets prix à partir d'une jointure au lieu de les charger à la demande.
Quand je précise juste les critères sur le produit, il n'y a aucun problème :
Il y a bien une jointure avec price dans la requête générée, et lorsque je parcours mes résultats, j'ai bien accès à la propriété prices de product sans requête supplémentaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Criteria productCriteria=session.createCriteria(Product.class); productCriteria.add(Restrictions.ilike("name", "%"+keyword+"%")); productCriteria.setFetchMode("prices", FetchMode.JOIN);
Imaginons que j'ose rajouter un critère sur le prix, comme là :
Dans ce cas, la requête généréee comporte également une jointure avec price, mais lorsque je parcours les prix contenus dans la propriété prices de mes objets product, il me fait une requête à chaque fois que j'accède aux propriétés d'un des objet price.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Criteria productCriteria=session.createCriteria(Product.class); productCriteria.add(Restrictions.ilike("name", "%"+keyword+"%")); productCriteria.setFetchMode("prices", FetchMode.JOIN); Criteria priceCriteria=productCriteria.createCriteria("prices", JoinFragment.INNER_JOIN); priceCriteria.add(Restrictions.gt("priceQuantity", 100));
J'utilise hibernate 3.2
Mapping de product :
Quelqu'un a-t'il une idée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <class name="dto.Product" table="product"> <id name="id" column="id"> <generator class="sequence"> <param name="sequence">product_id_seq</param> </generator> </id> <set name="prices" inverse="true"> <key column="product_id"/> <one-to-many class="dto.Price"/> </set> <property name="name" column="name"/> <property name="smallBoxQuantity" column="small_box_quantity"/> <property name="largeBoxQuantity" column="large_box_quantity"/> </class>
Partager