求教,paginateByFullSql与动态sql,咋玩?

1、sql模板

图片.png

2、业务层调用

图片.png

3、报错了。。。。。

图片.png

评论区

钮飞虎

2018-06-14 18:57

由于涉及到order by,不能直接用Db.paginate(), 文档也看过了,实例中是拼接的静态sql,像我这种动态生成的带order by 的sql,怎么实现分页呢?

JFinal

2018-06-14 19:03

使用 paginateByFullSql 的前提条件是,两条 sql 中使用的问号占位符的个数可以共享,相当于下面两个方法,不同的 sql 区享了同样的 paras:
String sqlAAA = "select * from tableAAA where aaa=? and bbb=?";
String sqlBBB = "select * from tableBBB" where ddd=? and eee=?";
Object paras = {123, 456};

Db.find(sqlAAA, paras);
Db.find(sqlBBB, paras);

观察上面两个 Db.find 所使用的参数,然后回到你的 paginateByFullSql 方法,里面有两条 sql:
String totalRowSql 以及 String findSql,然后你代码中调用了两次 getSqlPara 获取到了两个 SqlPara 对象,对比一下这两个 SqlPara.getPara() 出来的数据个数与数据值是不是完全一样的,如果是的话,则可以使用,否则就不能使用

JFinal

2018-06-14 19:06

这里的关键点就在于 paginateByFullSql 方法中的 Object... paras 这个参数是被前面两条 sql 参数所共享的,确保可以共享就能正常工作

JFinal

2018-06-14 19:08

设计这个 API 时,假定了用于分页的两条 sql , 只是 sql 部分的 select 部分有所不同,而参数部分是完全一样的

如果你的两条 sql 模板中的参数确实有所不同,有两个解决方向:
1:使用 #(...) 输出变量,这个输出不会生成问号占位符和 para,而 #para 指令会生成这两个东东

2:使用 select * ( 原 sql 在此) 加个嵌套来解决参数不同的问题

JFinal

2018-06-14 19:10

你的 Db.paginateByFullSql(...) 为啥传入 Object... paras 参数呢,加个参数进去:
Db.paginateByFullSql(..., sqlPara.getPara())

JFinal

2018-06-14 19:10

JFinal 06-14 19:10
你的 sql 模板中明明是有参数的,而你的 Db.paginateByFullSql(...) 为啥没有传入 Object... paras 参数呢,加个参数进去:
Db.paginateByFullSql(..., sqlPara.getPara())

钮飞虎

2018-06-14 19:48

@JFinal 好的,我试试,主要是生成的动态sql由条件决定,条件不同,参数值及个数也不同,但是打印出来的sql都是用,所以不知道该怎么传参了。

JFinal

2018-06-15 10:17

@钮飞虎 参数值及个数不同当然就不能用这个方法了,但是你可以通过一点改变让参数完全相同,例如用嵌套 sql , 以及针对某些不同参数使用 #(value) 来输出具体值,而不是 #para(...) 来生成问号占位

王志豪

2018-12-21 11:47

@JFinal SELECT
id,
mobile,
recommend_uid,
rewards_money,
create_time,
state,
user_id
FROM
t_money_in_detail
WHERE
recommend_uid = 1362
UNION ALL

SELECT
id,
mobile,
user_id,
cash_money,
completion_time,
'4',
NULL
FROM
t_cash
WHERE
user_id = 1362

ORDER BY
create_time DESC
LIMIT 0,
5
怎么用Jfinal写

JFinal

2018-12-22 12:45

@王志豪 直接写就好:
String sql = Db.getSql(...);
Db.find(sql);

热门反馈

扫码入社