web-dev-qa-db-fra.com

Données de printemps - ignorer le paramètre s'il a une valeur nulle

Je veux avoir une interface de référentiel de données de printemps qui prend deux paramètres. Y a-t-il un moyen de lui faire adopter le comportement suivant?

MyObject findByParameterOneAndParameterTwo( String parameterOne, String parameterTwo);

Si les deux paramètres ont une valeur, j'aimerais qu'il se comporte normalement et fasse un "ET" pour les deux valeurs.

Si, par exemple, le second paramètre est null, il ne recherchera que par ParameterOne

Aucune suggestion?

18
Panos

Je ne sais pas si cela est possible avec les méthodes de référentiel, mais vous pouvez utiliser @Query 

(:parameterOne is null or parameter1 = :parameterOne) and (:parameterTwo is null or parameter2 = :parameterTwo)
17
Kadzhaev Marat

Actuellement, ce n'est pas possible dans Spring-data-jpa

Il y a une JIRAticket à ce sujet qui est toujours sous investigation par l'équipe Spring.

enter image description here

Toutefois, si vous souhaitez une solution de contournement, vous pouvez extraire un exemple requête de critères simples .

9
Abdullah Khan

Une solution qui manque ici est la fonctionnalité Requête par exemple du JPA de Spring Data JPA et exploite le ExampleMatcher#ignoreNullValues , qui est conçu précisément pour résoudre ce problème. Une requête personnalisée et un générateur de requêtes sont nécessaires pas.

Cette requête Spring Data:

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", null), matcher);
List<MyObject> results = repository.findAll(exampleQuery);

Donne une requête qui ressemble à:

select * 
from myObject 
where parameter1 = "foo"

Alors que ce qui suit:

ExampleMatcher matcher = ExampleMatcher.matching().withIgnoreNullValues();
Example<MyObject> exampleQuery = Example.of(new MyObject("foo", "bar"), matcher);
List<MyObject> results = repository.findAll(exampleQuery);

Rendements:

select * 
from myObject 
where parameter1 = "foo"
and parameter2 = "bar"

Très sympa!

Remarque: vous devez ajouter à l'interface Repository une interface QueryByExample. Vous pouvez le faire soit en étendant directement l'interface QueryByExample, soit en implicite via la JpaRepository:

public interface MyObjectRepository extends JpaRepository<MyObject, Long> {}
2
Dovmo

Je suis nouveau dans l'espace Printemps/JPA, 

utilisez 'Query By Example'

j'utilise (dans seviceImp), tous les arguments ci-dessous sont facultatifs/dépend du choix de l'utilisateur 

`
  .
    if (!firstName.isEmpty() ) {
    staff.setFirstName(firstName);
    }



    if (!lastName.isEmpty() ) {
    staff.setLastName(lastName);
    }

    if (!ptAadhar.isEmpty() ) {
        patient.setPtAadhar(ptAadhar);
    }

    if (!Cell.isEmpty() ) {
        staff.setCell(Cell);
    }


      Example<StaffEntity> example = Example.of(staff);  

      List<StaffEntity> staffList =staffRepository.findAll(example);
       .
0
M Singh