请教,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 返回结果的基础上分页和排序, 请问大家怎么处理这个问题?

谢谢大家!!!

14754 次点击
所在节点    Java
37 条回复
Miy4mori
2017-01-11 19:55:25 +08:00
spring data jpa 也可以自定义 mapper ,请仔细阅读文档
incompatible
2017-01-11 19:55:48 +08:00
分两次查询咯

1. ARepository.findAll(Pagable),从取到的结果中 collect 出 bids
2. BRespository.find(Iterator of bids),然后手工跟步骤 1 的结果组合起来。

还有,从你的场景看来, b 可能是类似“分类”这样的基础数据? 这样的话针对 bid->bname 做一个缓存,步骤 2 的中直接查缓存,性能会更好。
Weixk
2017-01-11 20:07:01 +08:00
@Cbdy 觉得原生的 EntityManager 太粗糙了,还不如使用 JdbcTemplate 。
srx1982
2017-01-11 20:09:16 +08:00
@palmers 有异常的话,可以贴出来看看
BruceLi
2017-01-11 20:28:56 +08:00
google 一下 jpa namednativequery resultsetmapping 就能找到答案了。
sdandroid
2017-01-12 09:46:24 +08:00
@palmers 把查询 sql 做成视图,在创建和视图对应的 domain ,这样就是单表操作
palmers
2017-01-12 10:20:49 +08:00
@sdandroid 但是这个是变化的,而且很多啊 这个没完没了了就
palmers
2017-01-12 10:21:48 +08:00
@BruceLi 我没有找到使用 jpa 分页然后还可以自定义返回对象的 解答
palmers
2017-01-12 10:33:01 +08:00
@Miy4mori 你是指在实体类上定义 resultmapper 吗?
Miy4mori
2017-01-12 12:20:35 +08:00
@palmers 是的 另外 spring data jpa reference 里就有 native 查询加分页的例子
teemoer
2017-01-12 13:09:31 +08:00
返回 @query 注解下面的 方法 返回 类型 定义为

list<你定义的临时类> findByQueryAnnon();

下面是你临时类的定义
class 临时类{

ax ;
cd ;
ax;

// 三个字段 生成 get set 方法 我就是这样处理的
}
palmers
2017-01-12 13:29:25 +08:00
@teemoer 那你 @query 内容 sql 语句是什么样的?
palmers
2017-01-12 13:35:39 +08:00
@Miy4mori 我尝试了,但是报错, 一直提示 No property guessView found for type socgu!
@SqlResultSetMapping(
name="view",
classes={
@ConstructorResult(
targetClass=TView.class,
columns={
@ColumnResult(name = "sumber",type = String.class),

@ColumnResult(name = "lname",type = String.class),

@ColumnResult(name = "mnumber",type = String.class),

@ColumnResult(name = "mtime",type = Date.class),

@ColumnResult(name = "hname",type = String.class),

@ColumnResult(name = "vname",type = String.class)
}
)
}
)

@NamedNativeQuery(name="getView", query="select sg.sumber as sumber,sl.lname as lname, sg.mnumber as mnumber,sg.mtime as mtime,sg.hname as hname,sg.vname as vname from socgu sg left join soccle sl on sl.cguid = sg.leId", resultSetMapping="view")
BruceLi
2017-01-12 16:07:43 +08:00
@palmers query 不是有 setFirstResult(), setMaxResults() 这两个 api 吗。
palmers
2017-01-12 16:31:04 +08:00
@BruceLi 你好, 能详细说说吗?
q397064399
2017-01-13 10:13:37 +08:00
Spring in Action EntityManager 注入就好了 然后用 sql 查询,查询完了 之后组装实体
ebony0319
2019-06-25 23:37:50 +08:00
老哥,有新的解决方案么。

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

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

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

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

© 2021 V2EX