【发布时间】:2021-02-14 19:17:29
【问题描述】:
我在 Spring Boot 中使用 JpaSpecificationExecutor 但我不能 获取单列或选定列列表, 例如 SQL 查询是“Select firstname,lastname from student where firstname='abc';” 我面临 JpaSpecificationExecutor 的问题,它总是给出整个实体。
My some code added Repository Interface
```
@Repository
public interface PolicyRepository extends JpaRepository<Policy, Long>,JpaSpecificationExecutor<Policy> {
}
public class PredicateSpecification<T> implements Specification<T> {
private static final long serialVersionUID = 1L;
SearchCriteria search_criteria;
public PredicateSpecification(SearchCriteria criteria) {
this.search_criteria = criteria;
}
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Predicate> predicates = new ArrayList<>();
switch (search_criteria.getOperation()) {
case GREATER_THAN:
predicates.add(builder.greaterThan(root.get(search_criteria.getKey()).as(String.class),
builder.literal(search_criteria.getValue().toString())));
break;
case LESS_THAN:
predicates.add(builder.lessThan(root.get(search_criteria.getKey()).as(String.class),
builder.literal(search_criteria.getValue().toString())));
break;
case GREATER_THAN_EQUAL:
predicates.add(builder.greaterThanOrEqualTo(root.get(search_criteria.getKey()).as(String.class),
builder.literal(search_criteria.getValue().toString())));
break;
case LESS_THAN_EQUAL:
predicates.add(builder.lessThanOrEqualTo(root.get(search_criteria.getKey()).as(String.class),
builder.literal(search_criteria.getValue().toString())));
break;
case NOT_EQUAL:
predicates.add(builder.notEqual(root.get(search_criteria.getKey()), search_criteria.getValue()));
break;
case EQUAL:
predicates.add(builder.equal(root.get(search_criteria.getKey()), search_criteria.getValue()));
break;
case MATCH:
predicates.add(builder.like(builder.lower(root.get(search_criteria.getKey())),
"%" + search_criteria.getValue().toString().toLowerCase() + "%"));
break;
case MATCH_END:
predicates.add(builder.like(builder.lower(root.get(search_criteria.getKey())),
search_criteria.getValue().toString().toLowerCase() + "%"));
break;
case MATCH_START:
predicates.add(builder.like(builder.lower(root.get(search_criteria.getKey())),
"%" + search_criteria.getValue().toString().toLowerCase()));
break;
case IN:
predicates.add(builder.in(root.get(search_criteria.getKey())).value(search_criteria.getValue()));
break;
case ORDER_BY:
if (search_criteria.getValue().equals(OrderBy.ASC)) {
query.orderBy(builder.asc(root.get(search_criteria.getKey())));
} else if (search_criteria.getValue().equals(OrderBy.DESC)) {
query.orderBy(builder.desc(root.get(search_criteria.getKey())));
}
break;
case GROUP_BY:
query.groupBy(root.get(search_criteria.getKey()));
// query.multiselect(root.get(search_criteria.getKey()), builder.count(root));
break;
default:
break;
}
return builder.and(predicates.toArray(new Predicate[0]));
}
}
public List<Policy> getPolicyByPredicates() throws ParseException {
PredicateSpecification<Policy> psf1 = new PredicateSpecification<Policy>(
(new SearchCriteria("policyName", "test", SearchOperation.MATCH)));
PredicateSpecification<Policy> psf2 = new PredicateSpecification<Policy>(
(new SearchCriteria("isEnable",true, SearchOperation.EQUAL)));
return policyRepo.findAll(Specification.where(psf1).and(psf2));
}
```
above getPolicyByPredicates() method call from controller
and it returns List<Policy> but I want to return only specific columns.
如何使用 jpa 规范从实体返回特定列? 请帮帮我。
块引用
【问题讨论】:
标签: java spring spring-boot jpa specifications