Bonjour !
J'ai un problème avec hibernate (on s'en serait un peu douté)
Voici les données :
Une classe Price qui contient des prix de produits par client (rien de bien spécial, une association en quelque sorte)
1 2 3 4 5 6 7
|
public class Price{
private Product product;
private Company company;
private float unitPrice;
...
} |
Une classe Product qui contient les informations sur le produit et un Set de Price
1 2 3 4 5 6 7
|
public class Product{
private int id;
....
private Set<Price> prices;
....
} |
Le Set est mappé comme ça :
1 2 3 4 5
|
<set name="prices" fetch="join" lazy="false">
<key column="product_id"/>
<one-to-many class="Price"/>
</set> |
Lorsque je fait une requête sur les produits, j'aimerai bien qu'il me charge le set "prices" en même temps (en une seule requête).
Mais au lieu de ça il me génère une requête pour les produits et N requêtes pour charger les prix associés.
Quand y a 130000 produits ca gâche un peu les performances ... (une requête normale retourne dans les 500 produits, mais c'est déja très lent)
Je rencontre le problème uniquement en utilisant l'API criteria.
Voici un petit exemple de requête :
Qui marche en HQL :
FROM Product AS product JOIN FETCH product.prices AS price WHERE product.id=56688000 AND price.company.id=10022
Qui marche pas avec l'API criteria :
1 2 3 4 5 6 7
|
Criteria productCriteria=session.createCriteria(Product.class);
productCriteria.add(Restrictions.idEq(56688000));
productCriteria.setFetchMode("prices", FetchMode.JOIN);
Criteria priceCriteria=productCriteria.createCriteria("prices", JoinFragment.INNER_JOIN);
priceCriteria.add(Restrictions.eq("company.id",10022));
List<Product> products=(List<Product>)priceCriteria.list(); |
De plus il semblerait que la condition sur company.id soit ignoréee vu qu'il me renvoie aussi des prix d'autres entreprises ...
Une idée ?
Partager