Search by Many Optional Parameters in Spring Data JPA Repository

Spring Data optional parameter in query method

Too late to answer. Not sure about relationship between Bar and Goo. Check if Example can helps you.

It worked for me. I have a similar situation, entity User have set of attributes and there is findAll method which search user based on attributes(which are optional).

Example,

  Class User{
String firstName;
String lastName;
String id;
}

Class UserService{
// All are optional
List<User> findBy(String firstName, String lastName, String id){
User u = new User();
u.setFirstName(firstName);
u.setLastName(lastName);
u.setId(id);

userRepository.findAll(Example.of(user));
// userRepository is a JpaRepository class
}
}

Spring Data JPA : Efficient Way to Invoke Repository Methods with Optional Parameters

You could use Specifications for that:

private Specification<YourEntity> toSpecification(UUID id, Status status, Long version) {
return (root, query, builder) -> {
Set<Predicate> predicates = new HashSet<>();
predicates.add(builder.equal(root.get("id"), id));
if (status != null) predicates.add(builder.equal(root.get("status"), status));
if (version != null) predicates.add(builder.equal(root.get("version"), version));
return builder.and(predicates.toArray(Predicate[]::new));
};
}

If you let your repository extend JpaSpecificationExecutor you can use the build specification object like so:

Specification<YourEntity> specification = toSpecification(id, status, version);
Optional<YourEntity> result = repository.findOne(specification);

When using Hibernate Metamodel Generator you can also write builder.equal(YourEntity_.id, id) instead of builder.equal(root.get("id"), id).



Related Topics



Leave a reply



Submit