繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM