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?
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)
Actuellement, ce n'est pas possible dans Spring-data-jpa
.
Il y a une JIRA
ticket à ce sujet qui est toujours sous investigation par l'équipe Spring
.
Toutefois, si vous souhaitez une solution de contournement, vous pouvez extraire un exemple requête de critères simples .
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> {}
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);
.