CriteriaOperator is a lightweight, zero dependency, and type-safe wrapper around Java Persistence Criteria API, which simplifies building queries, particularly useful within REST SQL (RSQL) context.
Example of REST query that can be interpreted by the library:
https://localhost:64503/pets?birthdate.gte=2010-01-11&nickname.like=Ba
Which results in the following select:
select
p1_0.id,
p1_0.birthdate,
p1_0.name,
p1_0.pet_type_id
from
pet p1_0
where
p1_0.name like ? escape ''
and p1_0.birthdate>=?
There are a couple of easy steps to achieve the above:
- Add the dependency
<dependency>
<groupId>com.apulbere</groupId>
<artifactId>crop</artifactId>
<version>0.1.0</version>
</dependency>
- Define a DTO that contains all fields necessary for filtering. For example, if you want to do filtering on
String
type then you chooseStringCriteriaOperator
fromcom.apulbere.crop.operator
package.
@Getter
@Setter
public class PetSearchCriteria {
private StringCriteriaOperator nickname;
private LocalDateCriteriaOperator birthdate;
}
- Create an instance of the service that will parse the query. It requires
EntityManager
in the constructor.
@Bean
CriteriaOperatorService cropService(EntityManager entityManager) {
return new CriteriaOperatorService(entityManager);
}
- Finally, invoke the service's
create
method with the root entity and filter object. The result is a builder that lets you match the entity's meta-model with each field from the DTO. When done, execute the query.
@GetMapping("/pets")
List<PetRecord> search(PetSearchCriteria petSearchCriteria) {
return cropService.create(Pet.class, petSearchCriteria)
.match(PetSearchCriteria::getNickname, Pet_.name)
.match(PetSearchCriteria::getBirthdate, Pet_.birthdate)
.getResultList()
.stream()
.map(petMapper::map)
.toList();
}
For full example and to see all the capabilities of the library checkout pet-shop demo repository.