JPAUsersSpecification.java
package es.um.atica.faker.users.adapters.jpa;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import es.um.atica.faker.users.application.service.UsersSearchSpecificationService;
@Service
public class JPAUsersSpecification implements UsersSearchSpecificationService {
@Override
public Object defaultSpec() {
return new org.springframework.data.jpa.domain.Specification<UserEntity>(){
@Override
public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> query,CriteriaBuilder criteriaBuilder) {
// BY default all users have more tha 18
return criteriaBuilder.gt(root.get("age"),18);
}};
}
@Override
public Object buildAndSpec(Object element1, Object element2) {
return ((Specification<UserEntity>)element1).and((Specification<UserEntity>)element2);
}
@Override
public Object buildOrSpec(Object element1, Object element2) {
return ((Specification<UserEntity>)element1).or((Specification<UserEntity>)element2);
}
@Override
public Object buildSpecFor(String el1, String op, String el2) {
return new org.springframework.data.jpa.domain.Specification<UserEntity>(){
@Override
public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
switch(op) {
case ":":
return criteriaBuilder.equal(root.get(el1),"age".equals(el1)?Integer.parseInt(el2):el2);
case ">":
return criteriaBuilder.gt(root.get(el1),Integer.parseInt(el2));
case "<":
return criteriaBuilder.lt(root.get(el1),Integer.parseInt(el2));
case "~":
return criteriaBuilder.like(root.get(el1),el2 + "%");
default:
return null;
}
}
};
}
}