Spring Data JPA在@Query中怎么使用投影


本篇内容主要讲解“SpringDataJPA在@Query中怎么使用投影”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来免费云主机域名带大家学习“SpringDataJPA在@Query中怎么使用投影”吧!测试代码执行的 SQL然后当我换成自定义查询的方式时,效果就变成了这样:测试代码执行的SQL可以看到这里是查询了全部的字段(实在是让人摸不着头脑)。后来有同事提醒说是因为我写了select p导致的,我就尝试写明要查询的字段(但还是无法理解为什么在这种情况下投影直接不生效):
测试代码执行的 SQL从 SQL 上来看,这样写已经是实现了我想要的效果,可是实际上真正使用这个代码的时候,坑就又来了:
测试代码加了一行断言来模拟使用的场景
执行结果org.opentest4j.AssertionFailedError:
expected: “Doe”
but was: null
Expected :”Doe”
Actual :null直接黑人问号脸。分析了一下,执行的 SQL 没有问题,投影类也没有问题,那问题就是出在结果集映射的时候了。虽然没看过 JPA 的代码,但是最终肯定是基于 JDBC API 的,而JDBC API是怎么处理结果集映射的?
翻一翻 ResultSet 类可以看到一共有两种方法获取结果:by indexby name,仔细看看执行的 SQL,person0_.last_name as col_0_0_ last_name 自动生成了一个别名叫col_0_0_,而投影类中能获得的信息只有字段名last_name而没有别名col_0_0_,所以 by name 的路走不通;
那么by index呢,很明显也不行,我这里的示例只有一个字段,假如有两个字段,那么SQL 中的字段的顺序和投影类中的字段的顺序就无法保证一致,从而就无法根据 index 来获取想要的对应的结果。然后就是验证环节了,假如是因为名字映射不上导致的结果为 null,那我就给你一个能对应的名字:
测试代码执行的 SQL虽然执行的 SQL 上还是用了自动生成的别名,但是断言却通过了,猜测是 JPA 在解析 Query 的时候存储了手动声明的别名信息。到此,相信大家对“SpringDataJPA在@Query中怎么使用投影”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: Java线程之间的共享与协作是什么

这篇文章主要讲解了“Java线程之间的共享与协作是什么”,文中的讲解内容免费云主机域名简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程之间的共享与协作是什么”吧!进程是操作系统进行资源分配的最小单位,其中包括:CPU、…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/21 18:01
下一篇 03/21 18:01

相关推荐