How to use Criteria Queries in Spring Boot Data Jpa Application
With Spring-boot-jpa
you are able to use entityManager
nearly everywhere. The most commom way is to create an own interface
for custom methods.
public interface StudentCustomRepository {
void anyCustomMethod();
Student getStudentByName(String name);
}
Then implement this interface to a service class where you are able to autowire and use the entityManager
:
@Service
public class StudentCustomRepositoryServiceImpl implements StudentCustomRepository {
@PersistenceContext
private EntityManager em;
@Override
public void anyCustomMethod(){
//here use the entityManager
}
@Override
StudentEntity getStudentByName(String name){
Criteria crit = em.unwrap(Session.class).createCriteria(StudentEntity.class);
crit.add(Restrictions.eq("name", name));
List<StudentEntity> students = crit.list();
return students.get(0);
}
}
You can also decide to implement your StudentRepository
to your new StudentCustomRepositoryServiceImpl
class.
From the docs
To enrich a repository with custom functionality you first define an interface and an implementation for the custom functionality. Use the repository interface you provided to extend the custom interface.
Define an interface like so
public interface StudentRepositoryCustom {
List<String> nameByCourse(String coursename);
}
Then define a custom implementation of this interface like so
@Service
class StudentRepositoryImpl implements StudentRepositoryCustom {
@PersistenceContext
private EntityManager em;
public List<String> nameByCourse(String coursename) {
CriteriaBuilder cb = em.getCriteriaBuilder();
//Using criteria builder you can build your criteria queries.
}
}
Now you can extend this custom repository implementaion in your JPA repository like so.
public interface StudentRepository extends CrudRepository<StudentEntity, Integer>, StudentRepositoryCustom {
}
Learn more about criteria query and criteria builder here