Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equivalent of criteria in spring-data-jpa

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 ....
like image 667
Hayi Avatar asked Jun 29 '14 23:06

Hayi


1 Answers

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);
    }
}
like image 189
Rafik BELDI Avatar answered Oct 08 '22 06:10

Rafik BELDI