Skip to content
/ crop Public

a lightweight, zero dependency, and type-safe wrapper around Java Persistence Criteria API, which simplifies building queries, particularly useful within REST SQL (RSQL) context

License

Notifications You must be signed in to change notification settings

apulbere/crop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CriteriaOperator (CrOp)

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:

  1. Add the dependency
<dependency>
    <groupId>com.apulbere</groupId>
    <artifactId>crop</artifactId>
    <version>0.1.0</version>
</dependency>
  1. Define a DTO that contains all fields necessary for filtering. For example, if you want to do filtering on String type then you choose StringCriteriaOperator from com.apulbere.crop.operator package.
@Getter
@Setter
public class PetSearchCriteria {
    private StringCriteriaOperator nickname;
    private LocalDateCriteriaOperator birthdate;
}
  1. 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);
}
  1. 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.

About

a lightweight, zero dependency, and type-safe wrapper around Java Persistence Criteria API, which simplifies building queries, particularly useful within REST SQL (RSQL) context

Topics

Resources

License

Stars

Watchers

Forks

Languages