Maison > Java > javaDidacticiel > Comment puis-je créer des requêtes JPA Dynamic Spring Data avec des clauses AND arbitraires ?

Comment puis-je créer des requêtes JPA Dynamic Spring Data avec des clauses AND arbitraires ?

Mary-Kate Olsen
Libérer: 2024-12-10 13:42:14
original
857 Les gens l'ont consulté

How Can I Create Dynamic Spring Data JPA Queries with Arbitrary AND Clauses?

Requête du référentiel JPA Dynamic Spring Data avec clauses AND arbitraires

Problème :
Les référentiels JPA Spring Data prennent en charge la création de requêtes avec des paramètres fixes et prédéfinis paramètres. Cependant, il est nécessaire de générer dynamiquement des requêtes avec des clauses AND arbitraires basées sur des champs fournis par l'utilisateur. Cette approche est peu évolutive et nécessite une définition de requête explicite pour chaque combinaison possible.

Meilleure approche : spécifications avec l'API Criteria
Spring Data fournit des spécifications qui exploitent l'API Criteria pour créer des spécifications flexibles et dynamiques. requêtes. En étendant l'interface du référentiel avec JpaSpecificationExecutor, il est possible d'exécuter des spécifications à l'aide de diverses méthodes, notamment findAll.

Interface de spécifications :

public interface Specification<T> {
    Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder);
}
Copier après la connexion

Exemple d'implémentation :

public static Specification<Customer> isLongTermCustomer() {
    return new Specification<Customer>() {
        public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            LocalDate date = new LocalDate().minusYears(2);
            return builder.lessThan(root.get('dateField'), date);
        }
    };
}

public static Specification<Customer> hasSalesOfMoreThan(MontaryAmount value) {
    return new Specification<Customer>() {
        public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
            // build query here
        }
    };
}
Copier après la connexion

Exemple Utilisation :

List customers = customerRepository.findAll(isLongTermCustomer());

MonetaryAmount amount = new MonetaryAmount(200.0, Currencies.DOLLAR);
List<Customer> customers = customerRepository.findAll(
    where(isLongTermCustomer()).or(hasSalesOfMoreThan(amount)));
Copier après la connexion

Spécifications complexes :

Pour les spécifications complexes, vous pouvez définir des méthodes personnalisées dans votre classe de spécifications :

public static Specification<WorkInProgress> findByCriteria(final SearchCriteria searchCriteria) {
    return new Specification<WorkInProgress>() {
        public Predicate toPredicate(Root<WorkInProgress> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            List<Predicate> predicates = new ArrayList<Predicate>();
            // Add predicates based on search criteria
            return cb.and(predicates.toArray(new Predicate[] {}));
        }
    };
}
Copier après la connexion

Conclusion :
Les spécifications permettent la génération de requêtes dynamiques sans avoir besoin d'une définition explicite de requête. Cette approche est évolutive et extensible, simplifiant la création de requêtes flexibles et personnalisables. Reportez-vous à la documentation des référentiels JPA pour plus d'informations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal