Cette seconde partie va pemettre d'intégrer QueryDSL pour construire des requêtes complexes sans (trop) écrire du code.
QueryDSL s'appuie sur les notions de DDD (Domain Driven Design) qui ne seront pas abordées ici.
Vous pouvez partir des sources du projet de la demo1 puis l'enrichir avec les six étapes suivantes afin d'intégrer QueryDSL:
I) Compléter le pom avec les dépendances QueryDSL,
II) Ajouter dans le pom la déclaration du plugin apt,
III) Rafraîchir le classpath d'eclipse,
IV) Adapter l'interface Repository qui doit hériter de QueryDslPredicateExecutor,
V) Générer des classes Q* de QueryDSL,
VI) Ecrire un test JUnit.
Les étapes (III et V) ne sont rappelées que pour plus de clarté puisqu'elles ne font presque que rafraîchir le projet.
Nous allons détailler ces étapes avec une démo pratique assez concrète.
DEMO2: Spring-DATA-JPA et QueryDSL
Voici en détail les 6 étapes d'intégration de QueryDSL:
I) Compléter le pom avec les dépendances QueryDSL
<!-- QueryDSL --> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl-version}</version> <scope>${dependency-deploiement-scope-provided}</scope> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>${querydsl-version}</version> <scope>${dependency-deploiement-scope}</scope> </dependency>
Pensez à rajouter les propriétés telle querydsl-version.
II) Ajouter dans le pom la déclaration du plugin Apt
Ajouter dans le pom la déclaration du plugin apt permettant la génération des Q* classes:
<!-- queryDSL Apt --> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>maven-apt-plugin</artifactId> <version>1.0.2</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources</outputDirectory> <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>
Ainsi les classes Q* seront générées dans le dossier target/generated-sources.
C'est à l'étape V ci-après que ces Q* classes seront générées.
III) Rafraîchir le classpath d'eclipse
Lancer la commande
mvn eclipse:eclipse
Puis rafraîchir le projet dans eclipse.
Ou lancer "update dependencies" dans eclipse.
IV) Adapter l'interface Repository qui doit hériter de QueryDslPredicateExecutor
Par exemple, pour ClientRepository cela donne :
public interface ClientRepository extends JpaRepository<Client, Long>, QueryDslPredicateExecutor<Client>
Et pour le CompteRepository :
public interface CompteRepository extends JpaRepository<Compte, Long>, QueryDslPredicateExecutor<Compte>
V) Génération des Q* classes de QueryDSL
Sous eclipse, effectuer un "update dependencies" ou lancer mvn install -DskipTests,
VI) Test JUnit
Appeler la méthode findAll(Predicat p):
Par exemple, pour le repository CompteRepository, le code s'écrit :
List<Compte> comptes= (List<Compte>)compteRepo.findAll( QCompte.compte.client.nom.like("Kerv%"))
Plus détaillé, voici un extrait de la méthode de test JUnit:
@Autowired CompteRepository compteRepo; @Test public void testQueryDSL(){ /*on suppose qu'un compte appartenant au client KERV existe */ List<Compte> comptes=(List<Compte>) compteRepo.findAll( QCompte.compte.client.nom.like("KERV%")); Assert.assertTrue(comptes.size()>0); }
La ligne qui nous intéresse est findAll(QCompte....).
Le predicat est établi à partir de la classe QCompte générée et le principe fluent API permet l'enchaînement des appels.
Ainsi nous avons construit à l'aide de l'interface QueryDslPredicateExecutor et les classes Q* de nouvelles requêtes sans écrire du code.
J'espère que c'est bien clair:)
Merci pour cet article. Je decouvre votre site web. Les articles ont l’air d’etre tres accessibles.
http://www.abritechnique.co
I translated this page in google translate…