Bonjour,

je suis confronté à un problème un peu particulier dans lequel j'aimerais appliquer deux restrictions à une même association dans le cadre d'une même requête.

Je m'explique: j'ai une entité "produit" et une entité "catégorie". Un produit peut appartenir à plusieurs catégories, et une catégorie peut contenir plusieurs produits, d'où la relation n<->n.

-> Un produit peut être par exemple: "table", "lit", "télévision", "pelle", etc.
-> Une catégorie peut être par exemple: "meubles", "hi-fi", "jardinage", etc.

Lorsqu'un client se connecte au site, il peut choisir de n'afficher que les produits appartenant aux catégories de son choix, la requête suivante est alors utilisée:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
private static final String LIST_PRODUCTS =
        "SELECT DISTINCT product " +
        "FROM POJO_Product product " +
        "LEFT OUTER JOIN product.categories category " +
        "WHERE category.id IN (:categoriesId)";
Où "categoriesId" est un tableau ou une liste d'ids. Cette requête fonctionne sans problème.

Là où les choses se complexifient un peu, c'est lorsque je souhaite donner à l'utilisateur la possibilité de lister les produits "qui appartiennent à telle ou telle catégorie ET qui sont distribués par telle enseigne". Autrement dit, faire un filtrage des produits par catégorie ET par marque.

Pour l'instant, j'ai considéré que les "marques" étaient elle aussi des catégories, par simplicité, et la requête pour obtenir le filtrage voulu devient alors la suivante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
private static final String LIST_PRODUCTS =
        "SELECT DISTINCT product " +
        "FROM POJO_Product product " +
        "LEFT OUTER JOIN product.categories category " +
        "WHERE category.id IN (:categoriesId) " +
        "AND EXISTS ( " +
            "SELECT DISTINCT product2 " +
            "FROM POJO_Product product2 " +
            "LEFT OUTER JOIN product2.categories category2 " +
            "WHERE category2 .id = :brandCategoryId " +
            "AND product2.id = product.id " +
        ")";
Où "categoriesId" est un tableau ou une liste d'ids, et "brandCategoryId" l'id d'une catégorie d'une marque. Cette requête fonctionne également.

La seconde restriction (à partir du "AND") permet de vérifier le critère "distribué par telle marque" explicité ci dessus. Bien qu'elle fonctionne, cette requête me semble malgré tout assez complexe et j'aimerais savoir si il n'y a pas un moyen plus simple/judicieux de l'implémenter?

J'ai également envisagé de créer une entité "Marque" mais ça ne changera pas grand chose à la requête, ça ne fera qu'ajouter des jointures supplémentaires, par ailleurs, j'ai pris des produits et des catégories pour rendre le post plus simple, mais dans mon modèle, ce ne sont pas exactement des produits et des catégories qui sont utilisés, et l'ajout d'une entité "Marque" semble vraiment superflu!

Merci d'avance pour vos conseils, remarques, et/ou suggestions