问题描述
我在春季引导中使用JpaSpecificationExecutor,但是我无法 要获取单列或选定的列列表, 例如,SQL查询是“从学生那里选择firstname,lastname,其中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规范从实体返回特定列? 请帮助我。
Blockquote
解决方法
您能否详细说明或举例说明“获取单列或所选列列表”的含义。查询的结果将基于您定义的策略实体进行映射。如果要从列表中获取特定属性,可以在调用getPolicyByPredicates()方法后从流中使用“地图”。
示例:
List<Policy> result = getPolicyByPredicates();
List<String> lastNames = result.stream()
.map(Policy::getLastName)
.collect(Collectors.toList());
上面的示例仅显示了获取“姓氏”,但您仍然可以选择要获取的列。