Quick Start¶
Setup¶
Define your JPA entities and repositories as usual:
@Entity
class User(
@Id val id: Long,
val name: String,
val age: Int,
val email: String?,
val role: String,
val isActive: Boolean
)
interface UserRepository : JpaRepository<User, Long>, JpaSpecificationExecutor<User>
No additional configuration is needed. The DSL is available as soon as the dependency is on the classpath.
Three DSL flavors¶
The library provides the same operations across three layers depending on what you want to return:
| DSL | Returns | Use when |
|---|---|---|
| Specification DSL | Specification<T> |
You use JpaSpecificationExecutor |
| PredicateSpecification DSL | PredicateSpecification<T> |
You want query-independent conditions (Spring Data JPA 4.x), passed to JpaSpecificationExecutor or reused in Specification, UpdateSpecification and DeleteSpecification |
| Predicate DSL | Predicate |
You need a raw predicate inside a custom Specification {} block |
Your first query¶
// Single condition
val activeUsers = User::isActive.equal(true)
repository.findAll(activeUsers)
// Combined conditions
val activeAdults = User::isActive.equal(true) and User::age.greaterThan(18)
repository.findAll(activeAdults)
// Reusable specs
fun activeUsers() = User::isActive.equal(true)
fun adults() = User::age.greaterThan(18)
repository.findAll(activeUsers() and adults())
Next steps¶
- Basic Operations - equality, comparison, string, nullability, bool, inclusion
- Collection Operations - collection operations
- Nested Properties - the
/operator for embedded and associated properties - Joins - querying across relationships
- Combining Specifications -
and,or, multi-condition combiners - Hibernate Module - Hibernate-specific extensions