2017-10-10 18 views
1

J'ai une relation multiple-Product-Category simple, où Product a un attribut List < Category> "categories", et Category a une liste < Produit> Attribut "produits". Le mappage JPA ORM fonctionne plutôt bien.Plusieurs à plusieurs JPQL @Query avec List comme argument au printemps

Dans ProductRepository, je souhaite inclure une méthode qui prend un nom partiel et une liste de catégorie en tant que paramètre et renvoie tous les produits contenant le nom donné et l'une des catégories de la liste de paramètres. Ma question est: est-il possible de spécifier ma requête dans un @Query? Comment?

@Repository 
public interface ProductRepository extends JpaRepository<Product, Integer> { 

    @Query("SELECT obj FROM Product obj WHERE obj.name LIKE %?1 AND obj.categories ?????") 
    List<Product> findByNameCategories(String name, List<Category> categorias); 
} 

Répondre

1

Vous y êtes presque. Vous pouvez concevoir votre requête pour faire ce que vous voulez sans avoir à utiliser l'annotation @Query

List<Product> findByNameStartingWithAndCategoriesIn(String name, Set<Category> categorias); 

Pour des résultats distincts:

Set<Product> findDistinctByNameStartingWithAndCategoriesIn(String name, Set<Category> categorias); 

Spring crée automatiquement la requête appropriée pour vous. Vous pouvez également vous EndingWith pour envelopper le paramètre se terminant par% ou Containing d'avoir le paramètre enveloppé des deux côtés%

Je changé List<Category> categorias à un ensemble parce que la liste peut avoir dupliquer les objets de catégorie dans la liste en un ensemble sera Ce n'est pas le cas quand il crée la requête en coulisses, vous aurez des identifiants uniques dans la clause In.

Spring Documentation on crafting queries

+0

Utilisation géniale des noms standards, merci. Juste une question: la méthode renvoyait des produits répétés. Afin d'obtenir des produits distincts, j'ai remplacé le type de retour à Set < Product> mais voici ma question: apparemment toutes les valeurs répétées proviennent de la base de données, puis ils sont post-filtrés par la structure de données Set. Y a-t-il un meilleur moyen d'obtenir des valeurs distinctes? En d'autres termes: pour obtenir des valeurs distinctes directement à partir de la base de données? –