【问题标题】:Why the multiselect method in JPA does not work为什么 JPA 中的多选方法不起作用
【发布时间】:2015-03-04 10:56:28
【问题描述】:

我想从用户表中选择三个属性,但它返回了用户的所有属性。我使用的代码如下:


Specification<Users> spec = new Specification<Users>() {

            @Override
            public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> query,
                    CriteriaBuilder cb) {
                // TODO Auto-generated method stub
                List<Predicate> ps = new ArrayList<Predicate>();
                ps.add(cb.equal(root.<String>get("userName"), userName));

                List<Selection<?>> selections = new ArrayList<Selection<?>>();
                selections.add(root.get("id"));
                selections.add(root.get("birth"));
                selections.add(root.get("userName"));
                query.multiselect(selections);

                query.where(ps.toArray(new Predicate[ps.size()]));
                return query.getRestriction();
            }
        };
        return repository.findOne(spec);

我正在等待您的建议。

【问题讨论】:

    标签: java spring jpa


    【解决方案1】:

    我也遇到过这样的问题,multiselect也不行,换个方式OK:

        CriteriaBuilder cb = entityManager.getCriteriaBuilder();           
        CriteriaQuery<Tuple> cq = cb.createTupleQuery();     
        Root<AccountFlowInfoEntity> root = cq.from(AccountFlowInfoEntity.class);
    
        List<Expression<?>> grouping = new ArrayList<Expression<?>>();
        grouping.add(root.get("tradeDate"));
        grouping.add(root.get("tradeType"));
        cq.multiselect(root.get("tradeDate"),
                       root.get("tradeType"),
                       cb.sum(root<BigDecimal> get("tradeAmount"))
                       );
    
        Predicate p = cb.conjunction();
        if (!StringUtils.isEmpty(root.get("custId")))
        p=cb.and(p,cb.equal(root<String>get("custId"),paramsMap.get("custId")));
    
        cq.where(p);
        cq.groupBy(grouping).orderBy(cb.asc(root.get("id")));
        Query query  = entityManager.createQuery(cq).
     setFirstResult((int)paramsMap.get("pageNum")).setMaxResults((int)paramsMap.get("pageSize"));
    

    【讨论】:

    • 以后如有需要,请附上英文翻译。
    【解决方案2】:

    由于已知问题https://jira.spring.io/browse/DATAJPA-1532 Multiselect 不适用于 repo.findall 方法。我通过将实体管理器自动装配到服务类来处理这个问题。你可以在这里找到工作代码https://github.com/bsridharpatnaik/CriteriaMultiselectGroupBy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2018-08-06
      • 2012-01-14
      相关资源
      最近更新 更多