Equivalent of criteria in spring-data-jpa

16,339

Solution 1

It's QueryDSL. Here's a blog post on how to use it with Spring Data.

Solution 2

the Equivalent in Spring Jpa Data is Specification, and you can use the repository SpecificationExecutor<T> and Jpa MetaModel to create your Jpa Criteria.

You can find an introduction about Jpa JpaSpecificationExecutor

A quick example :

  1. Entity

@Entity

public class ClassRoom {
    // id and other properties

    @ManyToOne
    private School school;

    private Date creationDate;

    private String reference;
    // Getters and setters
}

2.Repository:

    @Repository
public interface ClassRoomRepository extends JpaSpecificationExecutor<ClassRoom>{
}

2.Service interface:

public interface ClassRoomService {

List<ClassRoom> list(String reference, String schoolName,
        Date creationDate)
}

3.Service Implementaion:

import static yourpackage.ClassRoomSpecifications.*;
import static org.springframework.data.jpa.domain.Specifications.*;
@Service
public class ClassRoomServiceImpl implements ClassRoomService {

    @Resource
    private ClassRoomRepository repository;


    @Override
    @Transactional(propagation = Propagation.SUPPORTS)
    public List<ClassRoom> list(String reference, String schoolName,
            Date creationDate) {

        Specifications<ClassRoom> spec = null;
        Specifications<ClassRoom> tempo = null;

        spec = where(findPerSchool(schoolName));

        if (reference != null) {
            tempo = where(findPerReference(reference));
        }

        if (creationDate!=null) {
            tempo = tempo == null ? where(findPerCreationDate(creationDate):tempo.and(findPerCreationDate(creationDate));
        }
        spec = tempo == null ? spec : spec.and(tempo);
        return repository.findAll(spec);
    }
}

Solution 3

With Spring data you just need to use repositories.

   And  findByLastnameAndFirstname  … where x.lastname = ?1 and x.firstname = ?2
   Or   findByLastnameOrFirstname   … where x.lastname = ?1 or x.firstname = ?2
   Between  findByStartDateBetween  … where x.startDate between 1? and ?2
   LessThan findByAgeLessThan   … where x.age < ?1
   GreaterThan  findByAgeGreaterThan    … where x.age > ?1
   IsNull   findByAgeIsNull … where x.age is null
   IsNotNull,NotNull    findByAge(Is)NotNull    … where x.age not null
   Like findByFirstnameLike … where x.firstname like ?1
   NotLike  findByFirstnameNotLike  … where x.firstname not like ?1
   OrderBy  findByAgeOrderByLastnameDesc    … where x.age > ?1 order by x.lastname desc
   Not  findByLastnameNot   … where x.lastname <> ?1
Share:
16,339
Hayi
Author by

Hayi

Updated on June 04, 2022

Comments

  • Hayi
    Hayi almost 2 years

    I was using hibernate but i heard that spring-data-jpa is the best so i try it and i'm satisfy with it until i face this issue.

    I have a search form in my jsp with many criteria and the user can choose whatever he want.

    So what is the equivalent of this request in spring-data-jpa

    if(startDate!=null){
        criteria.add(Expression.ge("date",startDate));
    }
    if(endDate!=null){
        criteria.add(Expression.le("date",endDate));
    }
    if(volume!=null){
        criteria.add(Expression.ge("volume",volume));
    }
    if ....
    
  • Hayi
    Hayi almost 10 years
    Specification are hard to code and very verbose as the say in the link you give me.
  • elysch
    elysch almost 10 years
    I think you should have added an excerpt of the blog here, just in case the link stop working. Great info, by the way.
  • Viktor Vix Jančík
    Viktor Vix Jančík almost 8 years