[英]How to retrieve specific field using Specification in Spring boot
我在 Spring Boot 中使用 JpaSpecificationExecutor,但我无法获取单列或选定的列列表,例如 SQL 查询是“从学生中选择名字,姓氏,其中名字='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 规范从实体返回特定列? 请帮我。
块引用
您能否详细说明或举例说明“获取单列或选定的列列表”的含义。 您的查询结果将根据您定义的 Policy 实体进行映射。 如果您想从列表中获取特定属性,您可以在调用 getPolicyByPredicates() 方法后使用流中的“Map”。
例子:
List<Policy> result = getPolicyByPredicates();
List<String> lastNames = result.stream()
.map(Policy::getLastName)
.collect(Collectors.toList());
上面的示例仅显示了获取“lastNames”的信息,但您仍然可以选择要获取的列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.