Spring JPA 动态列查询有什么好的思路

2022-06-06 15:28:35 +08:00
 leiuu

例如数据库表可能存放有 30 列,本身是列式存储。

实际的查询场景可能每次查询 5 列,且组合可能不一样。

如果用 jpa projections 可能面临需要定义一堆 entiny ,组合数爆炸。

2956 次点击
所在节点    Java
30 条回复
bz5314520
2022-06-06 15:35:53 +08:00
楼主是想说,会定义太多的 dto?
leiuu
2022-06-06 15:38:51 +08:00
@bz5314520 对的 动态列每一个组合可能都需要一个 dto 不太优雅 😂
Vaspike
2022-06-06 15:50:53 +08:00
@leiuu #2
DTO 处:返回的数据字段换成 Map 类型会不会好些
JPA 处: 我还真忘了 JPA 返回 Map 类型是不是一定要写 native sql ,OP 自己评估下吧
Tenlearn
2022-06-06 15:51:11 +08:00
这和 jpa 有什么关系,映射到对象不就这样吗
iosyyy
2022-06-06 15:51:22 +08:00
用 QueryDsl 试试
sujin190
2022-06-06 15:54:44 +08:00
@Query("select new com.demo.ArticleQueryDto(a.id, a.viewCount) from t_article a")

Query 声明的时候 select 用 new 啊,然后写不同的参数的构造函数就是了呗,转换 sql 语句的时候似乎只会 select 你访问的属性字段,似乎不会再 select 所有字段了
suman
2022-06-06 16:08:27 +08:00
JPA Specification
EastLord
2022-06-06 16:29:22 +08:00
querydsl 如何
bz5314520
2022-06-06 16:37:56 +08:00
@leiuu 我没觉得不优雅,你这样查询估计也是一个接口对应一个前端视图,静态类型检查反而方便调试。这种生成 dto 的体力活,用 IDEA 的插件 JPA BUDDY 生成就行。
leiuu
2022-06-06 17:11:51 +08:00
@Vaspike 这是个方法 但估计得用 createQuery 写 nativeSql

@Tenlearn

@iosyyy QueryDsl 很强大 👍 用 DSL 可以实现

@suman 可以解决动态 where 但 select column 不行的

@sujin190 哈哈 666 的操作可行 !

@bz5314520 理解了。这也是一个法子哈。静态定义理解代价小。但总觉得需要维护很多类, 如果有更新会比较麻烦。
leiuu
2022-06-06 17:13:45 +08:00
@EastLord 可行! Dsl 可以搞定。 哈哈,其实想知道「更 jpa 」的写法。目前看 new object 不错。
sky857412
2022-06-06 17:16:34 +08:00
hakr
2022-06-06 17:23:32 +08:00
PopRain
2022-06-06 17:28:56 +08:00
这好像和我之前的问题类似:
https://www.v2ex.com/t/843880#reply10
nothingistrue
2022-06-06 17:31:11 +08:00
你这个返回的列是动态的,这就算到 SQL 那里也不是动态查询,你每次动态选择的列,对 SQL 执行屁影响都没有。WHERE 条件每次都是随机生成的,这才是 ORM 或者 SQL 查询上的动态查询。

请先把你的动态查询给分成两个过程。首先,WHERE 条件动态是一个过程,用 JPA 的 Specification 。然后,返回列的动态是一个过程,这个简单的很,你不论如何都查询出来一个 Entity ( JPA 的要求也必须是一个 Entity 对应一套表),然后在将这个 Entity ,根据接口返回的需要,返回不同的 DTO/VO ,或者仅返回指定字段的 Map (看你的场景,返回哪些列是用得时候才知道的,这样返回 MAP 更合适)。
Seney
2022-06-06 17:33:40 +08:00
除了上面 dsl/jpql, 还可以用投射,另外定义个 interface 相当于 dto 来接受结果集
leiuu
2022-06-06 17:59:55 +08:00
@nothingistrue 对理解有帮助 👍 这里之所以说是动态,因为默认是全部列返回,如果后端是列存数据库性能就会比较差
@Seney 你和楼上头像好像。dto 的方法可以👍,但可能一个 entity 我的场景中可以衍生出 15 个 dto 。他们只有个别字段不一样。
leiuu
2022-06-06 18:03:46 +08:00
@sky857412 Nope !

@hakr CriteriaQuery 可以实现👏


@PopRain 场景很相似!
duyaofei
2022-06-07 07:38:54 +08:00
感觉 jdbctemplate 更适合啊,这场景
zed1018
2022-06-07 08:56:04 +08:00
我觉得你这个其实更应该是 graphQL ?

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

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

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

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

© 2021 V2EX