Ressource

  • Probe: The actual example of a domain object with populated fields.
  • ExampleMatcher: The ExampleMatcher carries details on how to match particular fields. It can be reused across multiple Examples.
  • ⇒ Example: An Example consists of the probe and the ExampleMatcher. It is used to create the query.

Cette approche simplifie la crĂ©ation de requĂȘtes complexes sans avoir Ă  Ă©crire de nombreuses mĂ©thodes de repository ou des requĂȘtes JPQL complexes

public interface EtudiantRepository extends 
    JpaRepository<Etudiant, Long>,
    QueryByExampleExecutor<Etudiant> {
}

Supposons que nous ayons une entitĂ© Etudiant avec les attributs nom, prenom et departement. Pour trouver des Ă©tudiants d’un certain dĂ©partement, vous pouvez crĂ©er une instance de Etudiant avec le dĂ©partement souhaitĂ© et utiliser cette instance comme exemple (== un probe) pour la requĂȘte

@Service
public class EtudiantService {
 
    @Autowired
    private final EtudiantRepository repository;
 
    public List<Etudiant> trouverEtudiantsParDepartement(String departement) {
        Etudiant probe = new Etudiant();
        probe.setDepartement(departement); // On écrit un probe en settant le département
 
        return repository.findAll(Example.of(probe));
    }
}

⇒ Dans cet exemple, tous les Ă©tudiants appartenant au dĂ©partement spĂ©cifiĂ© seront retournĂ©s.​ Ceci nous Ă©vite d’écrire une Specification

Utilisation d’ExampleMatcher pour des correspondances avancĂ©es

Par défaut, QBE utilise une correspondance exacte pour les attributs non nuls. Cependant, avec ExampleMatcher, vous pouvez personnaliser la stratégie de correspondance, par exemple pour effectuer des recherches insensibles à la casse ou des correspondances partielles

@Service
public class EtudiantService {
 
    @Autowired
    private final EtudiantRepository repository;
 
    public List<Etudiant> rechercherEtudiants(String nom, String departement) {
        Etudiant probe = new Etudiant();
        probe.setNom(nom);
        probe.setDepartement(departement);
 
        ExampleMatcher matcher = ExampleMatcher.matching()
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
            .withIgnoreCase()
            .withIgnoreNullValues();
 
        return repository.findAll(Example.of(probe, matcher));
    }
}