关于 Spring data jpa 写原生 sql 的问题

2018-07-06 20:42:06 +08:00
 tamer

官网示例中的 @Query(nativeQuery=true) 原生 sql 语句都是

select * ....

, 结果自己用发现, select 部分字段的话, 缺失的字段会被抛出异常:... Column xxx not found.

比如 User 包含 id 和 name, 如果我只 select id from ...., 就会报错. 然后 gg

好不容易从 mybatis 切换到 data jpa, 结果最想要的功能没法用,

stack, 百度 都找不到解决方案, 是 jpa 太小众了, 还是我搜索姿势不对....

要是放弃了, 实在不甘心啊...

有没有也遇到过此问题的道友, 抱拳了 老铁




9080 次点击
所在节点    Java
50 条回复
tamer
2018-07-06 20:42:51 +08:00
@glues 老铁
AltairT
2018-07-06 20:44:58 +08:00
关注一下 感觉以后是主流技术了
airfling
2018-07-06 20:49:58 +08:00
部分字段只,如果只是一个 id 你可以用 list<idtype>,多的话可以用 list<map>
shalk
2018-07-06 20:51:35 +08:00
select user.id from user
Sharuru
2018-07-06 20:55:20 +08:00
通常是映射的结果集不正确。

另外,JPA 应用一般都是选择实体,通过 Stream 取得自己需要的列。
tamer
2018-07-06 21:01:48 +08:00
@shalk 不行, 版本: Maven: org.springframework.data:spring-data-jpa:2.0.8.RELEASE
tamer
2018-07-06 21:03:31 +08:00
@Sharuru 官网给出的例子只有 select *, 如果我把所有列都放到 select 语句中就可以成功执行, 但如果缺少某某列, 就会报错,

select user_id from : xx
select user_id , username from : √√
所以可以判断映射的字段是匹配的
lhx2008
2018-07-06 21:04:21 +08:00
可以返回一个 int 值再自己装?不知道有什么安全性考虑
tamer
2018-07-06 21:07:41 +08:00
@airfling map 确实可以映射, 但是除了直接从库中返回给前端的请求外, 涉及到对 User 的操作, map 就很蓝瘦了呀
tamer
2018-07-06 21:09:06 +08:00
@lhx2008 如果所有原生 sql 都必须这样手动封装一次....... 那 jpa 提供的一些蝇头小利真的被 mybatis 完爆啦
lhx2008
2018-07-06 21:09:58 +08:00
@tamer 但是全部拉出来并没有多多少资源,有洁癖还是用 mybatis 吧
lhx2008
2018-07-06 21:12:09 +08:00
我猜可能是如果有关联对象,会造成很严重的问题
tamer
2018-07-06 21:13:29 +08:00
@lhx2008 对于 json 字段, 取的话, 如果每次都必须强制获取全部, 还是很可怕的, 如果解决不了, 我还是只有换回 mybatis 啦
lhx2008
2018-07-06 21:13:41 +08:00
或者你重新封装一个类,只有 id,然后再让真正的 user 继承这个类,但是调用的时候也只能调用那个父类了
chocotan
2018-07-06 21:13:49 +08:00
select 部分字段 返回值改成 List<Object[]>

既然都是原生 sql 的话那用 jpa 的意义何在......
lhx2008
2018-07-06 21:15:03 +08:00
lhx2008
2018-07-06 21:17:54 +08:00
@tamer
json 返回不是大问题,你本来就应该在 json 返回的时候重新封装一个对象,直出数据库真的好吗
tamer
2018-07-06 21:28:11 +08:00
@lhx2008 一般情况下, 对于有的属性 实体类则被赋值, 没有的属性自动置为 null, 这不是 orm 框架应该做的吗

Hibernate 都可以自动映射, jpa 封装了 Hibernate 居然就不支持了...
tamer
2018-07-06 21:29:15 +08:00
@chocotan orm 自动映射的规则不是只要字段名一致, 有值就赋值, 没有值则为 NULL 吗? 现在 jpa 强制要求实体类每一个属性都必须有值, 这才是奇怪的地方把, Hibernate 和 Mybatis 都不是这样吧
sagaxu
2018-07-06 22:07:35 +08:00
jpa 的工作方式不同,你只能返回 List<Object[]>或者自己定义一个新类型。连返回 map 都不行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/468764

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX