ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

记录一下springdatajpa 使用findAll返回不想要的字段为什么不能实现!

2020-12-24 21:04:24  阅读:439  来源: 互联网

标签:springdatajpa get builder class predicates query 想要 root findAll


秋天的北京一如既往的没太阳,分不清天上是云是雾或者又是什么奇奇怪怪的东西,建筑物不分黑白的证明着自己的轮廓。雾蒙蒙的天一眼望不到边,就像我需要用到Spring Data Jpa 实现一个特别小的SQL,怎么写都看不到我想要的效果一样。

想实现的SQL十分简单,就是一个简单的统计:

SELECT
activity_code,
activity_name,
sum(contact_user_nums),
conversion_step_code,
conversion_step
FROM
epm_estimate_main
WHERE
activity_code =‘1’
GROUP BY
conversion_step_code
ORDER BY
contact_user_nums DESC;
由于一些条条框框的原因,最终选择用jpa的这种实现方式,想到这个玩意五分钟写完就能回家玩游戏,于是上来就写:

image.png

但是查询出来的结果却不是很好看:第一,我没有拿到想要的求和;第二,查询出来的结果集包括所有字段;
好在分组和排序都按照预期的想法实现了。

首先去B某搜索引擎上找,找来找去,大家的方法无非四种:
第一种:去XXX的JPA, MyBatis真香;
第二种:实在不行用JPQL;
第三种:自己创建CriteriaBuilder,CriteriaQuery及Root;
第四种:不知道怎么写,等大腿。

国内搜完,于是又去G某引擎上翻翻,老外似乎问的比较具体,但都没找到我想要的答案(散装的四级还是吃力);

翻看了一些网上的问题与解答,貌似出现了一个规律,用findAll方法实现Specification接口的文章似乎都有这个问题,而使用EntityManager自己来实现的小伙伴都不怎么关注。

赤裸裸的歧视,下定决心就要用这个findAll实现一把。

窗外的天色越来越暗,但是我觉得这么简单的一个查询居然浪费了我开黑的时间,不由得开始怀疑自己。不管我怎么对CriteriaQuery.multiselect操作,查询出来得结果集都是包含所有字段,不由得开始怀疑multiselect这个方法为什么没有生效,JpaSpecificationExecutor这个接口到底什么居心?

找到这个接口的API:有两个实现类(其中QuerydslJpaRepository已显示过期)
image.png

剩下的这个实现类SimpleJpaRepository中找到对应的findAll方法,它调用了本类中的其他方法,一路向下找,最终在方法调用的末端,找到了其中的猫腻:
image.png

我在multiselect方法中的所有定义都被 query.select(root) 覆盖掉了!

天色已晚,华灯初上,最后本来想重写一下这个方法,但撇了一眼楼下的公交站,广告牌的背景似乎有点过年的味道。

那段代码最终变成这样(Spring Boot自动注册了EntityManager):

    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<EstimateDO> query = builder.createQuery(EstimateDO.class);
    Root<EstimateDO> root = query.from(EstimateDO.class);

    query
            .multiselect(
                    root.get("activityCode"),
                    root.get("activityName"),
                    builder.sum(root.get("contactUserNums").as(Long.class)).alias("contactUserNums"),
                    root.get("conversionStepCode"),
                    root.get("conversionStep")
            );

    List<Predicate> predicates = new ArrayList();
    predicates.add(
            builder.equal(root.get("activityCode").as(String.class), estimateDO.getActivityCode())
    );

    if (!StringUtils.isEmpty(estimateDO.getContactCode())) {
        predicates.add(
                builder.equal(root.get("contactCode").as(String.class), estimateDO.getContactCode())
        );
    }

    query
            .where(predicates.toArray(new Predicate[predicates.size()]))
            .groupBy(root.get("conversionStepCode"))
            .orderBy(builder.desc(root.get("contactUserNums")));

    List<EstimateDO> list = entityManager.createQuery(query).getResultList();

我的决心一文不值。

标签:springdatajpa,get,builder,class,predicates,query,想要,root,findAll
来源: https://blog.csdn.net/hezhiwenmas/article/details/111655869

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有