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 :
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);
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.

Imaginons que j'ose rajouter un critère sur le prix, comme là :
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));
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.

J'utilise hibernate 3.2

Mapping de product :
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>
Quelqu'un a-t'il une idée ?