Présentation de Spring-DATA-JPA et QueryDSL ( Partie 2)

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:)

2 commentaires

  1. Merci pour cet article. Je decouvre votre site web. Les articles ont l’air d’etre tres accessibles.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.