Spring JPA Dépôt de requête dynamique
Actuellement, j'ai été en utilisant, au Printemps suivant, JPA Référentiel de la base de la requête personnalisée et il fonctionne très bien,
@Query("SELECT usr FROM User usr WHERE usr.configurable = TRUE "
+ "AND (" +
"lower(usr.name) like lower(:filterText) OR lower(usr.userType.classType.displayName) like lower(:filterText) OR lower(usr.userType.model) like lower(:filterText)"
+ ")"
+ "")
public List<User> findByFilterText(@Param("filterText") String filterText, Sort sort);
J'ai besoin de modifier cette requête lorsque le filtre de texte va être une valeurs séparées par des virgules. Mais comme la manière suivante ce sera une requête dynamique et comment puis-je exécuter.
Requête dynamique j'ai besoin de construire,
String sql = "SELECT usr FROM User usr WHERE usr.configurable = TRUE";
for(String word : filterText.split(",")) {
sql += " AND (lower(usr.name) like lower(:" + word + ") OR lower(usr.userType.classType.displayName) like lower(:" + word + ") OR lower(usr.userType.model) like lower(:" + word + "))";
}
regarder dans
Fournir une implémentation pour votre DAO, et d'exécuter cette requête dynamique de la mise en œuvre. docs.printemps.io/printemps-données/jpa/docs/current/reference/html/.... Le DAO ne devraient pas se déchirer. Il devrait prendre une List<String> ou<String> comme argument. L'appelant doit composer avec la séparation.
JpaSpecificationExecutor
Fournir une implémentation pour votre DAO, et d'exécuter cette requête dynamique de la mise en œuvre. docs.printemps.io/printemps-données/jpa/docs/current/reference/html/.... Le DAO ne devraient pas se déchirer. Il devrait prendre une List<String> ou<String> comme argument. L'appelant doit composer avec la séparation.
OriginalL'auteur Channa | 2015-05-25
Vous devez vous connecter pour publier un commentaire.
Par JB Nizet et la printemps-la documentation des données, vous devez utiliser une interface personnalisée + référentiel de mise en œuvre.
Créer une interface avec la méthode:
Créer une mise en œuvre:
Étendre la nouvelle interface dans votre Référentiel existant interface:
Enfin, l'appel à la méthode ailleurs:
Requête de mise en œuvre
Votre méthode de production de la
sql
variable, à savoir par la concaténation des chaînes dans la requête est mauvaise. De ne pas faire cela.La
word
qui vous concaténez doit être un valide JPQL identificateur, à savoir un:
suivie par un java identificateur de commencer, éventuellement suivie par certains java identificateur de la partie. Cela signifie que si votre fichier CSV contientfoo bar,baz
, vous allez tenter d'utiliserfoo bar
comme un identifiant et vous aurez une exception.Place, vous pouvez utiliser
CriteriaBuilder
pour construire la requête de façon sécuritaire:Fixe. Ça sonne comme du ressort des données est en train d'essayer d'interpréter le nom de la fonction
findByFilterText
, il ne devrait pas être en train de faire. Avez-vous rendre votre dépôt de prolonger le dépôt personnalisé?Oui, j'ai fait les choses comme vous le mentionnez. Qui veut dire que j'ai créé "MyEntityRepositoryCustom" de l'interface, puis plus tard, l'étendre à d'Référentiel existant Interface "interface publique MyEntityRepository s'étend JpaRepository<MyEntity, Long>, MyEntityRepositoryCustom"
J'ai eu une erreur dans le nom du dépôt, il doit être
MyEntityRepositoryImpl
, pasMyEntityRepositoryCustomImpl
. Voir si cette modification permet de.merci pour le feedback. J'ai fait le changement comme vous le mentionnez, mais encore j'en suis même exception :(. Prenez du bon temps !. Merci.
OriginalL'auteur beerbajay
J'ai été à la recherche de la solution moi-même :
La désignation de la "Coutume" référentiel de l'interface et de l'implémentation est très stricte (comme l'a dit il y Comment ajouter de la méthode personnalisée pour Spring Data JPA)
Donc, pour être clair, l'ensemble du code :
(Mais @beerbajay a droite)
La méthode personnalisée de l'interface
La coutume de la méthode de la mise en œuvre
De "l'original" référentiel
Vous pouvez maintenant utiliser le "original" référentiel avec les nouvelles méthodes personnalisées
OriginalL'auteur Obscur Moirage