Spring Data JPA : Query by Example(QBE)

Debendra Dhinda
3 min readApr 5, 2020
Image copied from https://www.google.com/ https://www.websparrow.org/wp-content/uploads/2019/06/springboot-data.png

If you are a java developer and if anyone asks to you to create an enterprise application, suddenly your head will move left & right around the JAVA orbit and Spring/Spring Boot framework will hit your brain. Of course others might be, but it is often. Am i right ?

Spring Boot ecosystem is an evolution of Spring framework which helps to create stand-alone, production-grade Spring based applications with minimal effort.

Lucky-draw Coupons

In a festival time, my manager asked me to implement the following use case .

  1. You have to find all the customers whose first name ends with some given character and to send some random lucky draw coupon code which they can redeem on a e-commerce site.

Yes, i can use native DB query ; but he doesn’t give green signal !!! 😄 for db query, because later he has to do some intermediate operations too and he ordered me to achieve it using spring boot .

Spring Data JPA

It facilitates the implementation of JPA based repositories. It makes the life easier to build spring based applications that uses data access technologies.

Spring Data JPA Query By Example

If you are using Spring Data JPA, you might have used JpaRepository of spring data JPA. If you check the JpaRepository.class you will find the below signature :

public interface JpaRepository<T, ID>extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {}

See, it extends QueryByExampleExecutor .So what is this and why it has extended ?

Query By Example(QBE) is a developer-friendly querying technique which facilitates to write dynamic query without any specific query-language.

It allows us to execute queries based on an Example entity instance. The field of the Example instance needs to be populated with the desired criteria values.

In Spring Data JPA we can use org.springframework.data.domain.Example instance which takes an entity instance (called 'probe' in this context).

E.g

//get all the customers whose first name is ending with 'dra' 
var customers = Customers.builder().firstName(ending).build();
var matcher = ExampleMatcher.matching()
.withIgnoreNullValues()
.withMatcher("firstName",
match ->match.endsWith().ignoreCase(true));
var example = Example.of(customers, matcher);

By default, fields having null values are ignored in the underlying query, so above Example will be equivalent to the following JPQL:

SELECT t from Customer c where c.firstName = '%dra';

Examples

I am going to implement the same above mentioned use case.

1. Get All customers2. Get all customers whose first name ends with 'dra'3. Get all customers whose last name ends with 'das'4. Get all customers whose first name equals 'Rosalin'5. Get all customers whose wallet balance is 2000

Let’s start with a simple example:

Find the code in GitHub.

Conclusion

In this tutorial, we have used Spring Data JPA Query By Example technique to generate queries. You might also be interested in the related tutorials:

--

--

Debendra Dhinda

Technology Enthusiast —Java8, Spring Boot, Micro-services, DDD, Web, Mobile, and Cloud-Native. Passionate about designing and developing scalable software.