【问题标题】:How to retrieve specific field using Specification in Spring boot如何在 Spring Boot 中使用规范检索特定字段
【发布时间】: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


    【解决方案1】:

    您能否详细说明或举例说明“获取单列或选定列列表”的含义。您的查询结果将根据您定义的策略实体进行映射。如果您想从列表中获取特定属性,您可以在调用 getPolicyByPredicates() 方法后使用流中的“映射”。

    例子:

    List<Policy> result = getPolicyByPredicates();
    List<String> lastNames = result.stream()
                               .map(Policy::getLastName)
                               .collect(Collectors.toList());
    

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

    【讨论】:

    • Actullay 在规范中执行查询,例如“select * from policy where pname="abc"”,但如果我想创建查询,例如“select pname,lastname,isenable from policy where pname="abc"”那怎么办?
    • 我面临另一个问题,即 select * from tablename 它提供了不必要的子表信息。例如,如果一个父母有很多孩子,即父子表中的一对多关系,如果我们使用 jpa 规范执行查询,它会检索父表和子表数据,我认为这会给大数据带来性能问题,那么如何可以在 JPA 规范中解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多