如何在Spring Boot中使用规范检索特定字段

问题描述

我在春季引导中使用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());

上面的示例仅显示了获取“姓氏”,但您仍然可以选择要获取的列。