请教,spring data jpa 中,分页查询返回多个表字段应该怎么处理?

2017-01-11 16:22:08 +08:00
 palmers

继承了 PagingAndSortingRepository , 这个接口提供了 Page<T> findAll(Pageable var1); 方法 我需要自定义 sql 然后返回字段是从两个表中挑选出来的. sql 类似这样的:

select a.name ax , a.cd cd , b.name ax from a 
left join b on b.id = d.bid

我需要在上面 sql 返回结果的基础上分页和排序, 请问大家怎么处理这个问题?

谢谢大家!!!

14750 次点击
所在节点    Java
37 条回复
sdandroid
2017-01-11 16:55:35 +08:00
做视图
palmers
2017-01-11 17:02:09 +08:00
@sdandroid 你的意思要在数据库中新建一个视图吗? 麻烦你给个比较详细的方案 谢谢了
Powered
2017-01-11 17:09:28 +08:00
我没看懂需求。。。
mercurylanded
2017-01-11 17:10:26 +08:00
换 mybatis
Charkey
2017-01-11 17:11:26 +08:00
@mercurylanded 同意。 23333333333333333
palmers
2017-01-11 17:22:51 +08:00
@Powered 我的需求是这样的, 使用 spring data jpa 分页查询, 然后返回的数据是两个表部分字段的组合对象
palmers
2017-01-11 17:23:22 +08:00
@mercurylanded 是啊 如果能换, 我肯定换了 绝对没这么麻烦
tedzhou1221
2017-01-11 17:34:41 +08:00
虽然我明白你的意思,但想了半小时办法,还是没想到~~

其实楼上的兄弟说,用视图搞也是可以的。
tedzhou1221
2017-01-11 17:36:58 +08:00
唉,说换 mybatis 的兄弟,不知道是怎么想的。

像我这种公司打杂的,公司项目架构,能说换就换?
Sharuru
2017-01-11 18:12:11 +08:00
架构里有其他辅助方法么?比如常见的命名像什么 builder , executor 之类的,可以快速生成 SQL 。

如果没有类似的 helper ,直接手写 JPQL 也是可以的。
AlisaDestiny
2017-01-11 18:30:41 +08:00
我现在做的项目是用 springboot ,现在刚开始,估计以后也会遇到你这个问题,先收藏了。(之前用的 mybatis 很好解决)
palmers
2017-01-11 18:37:37 +08:00
@AlisaDestiny ......................
palmers
2017-01-11 18:41:11 +08:00
@Sharuru JPQL 怎么解决 两个表部分字段组合为第三个对象返回的情况呢? 麻烦详细说说 谢谢了
mercurylanded
2017-01-11 18:50:55 +08:00
模型重新写做字段冗余,或者多查几次结果合并起来。
RadishWind
2017-01-11 18:57:06 +08:00
1.视图 create view 名字 as + 你的 sql 语句
2.子查询
3.直接 limit
caixiexin
2017-01-11 19:04:29 +08:00
就是因为这个,我不喜欢用 hibernate 这类 orm😌
srx1982
2017-01-11 19:34:05 +08:00
首先我有个疑问,你的 sql 里怎么会出现 d 表?前边是 a 表啊
我按照我目前的理解给一个答案你看看
1.新建个类 ABResult ,类全名 com.abc.ABResult ,写好构造方法 public ABResult(String aName, String aCd, String bName)
2.JPQL:"SELECT new com.abd.xxResult(a.name, a.cd, b.name) FROM TableA a LEFT JOIN FETCH a.b"
3.你的 T 就是 ABResult
这种 new 的写法我们一直在用,不知道合不合你的需求。
Cbdy
2017-01-11 19:46:17 +08:00
注入实体管理器,直接执行 SQL 。参考 Spring in action
palmers
2017-01-11 19:54:04 +08:00
@srx1982 嗯嗯 非常感谢! 我今天也找到你说的这种方案了! 但是测试失败了,我明天再详细看看。 不知道是不是因为 a b 两个表实体没有关联关系?

不好意思 ,我 sql 写粗心了, 应该是 left join b on b.id = a.bid
palmers
2017-01-11 19:55:12 +08:00
@Cbdy 这种需求比较多,那这样持久层接口是不是就没有什么用了?

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

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

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

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

© 2021 V2EX