首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
在JFinal2.2中为什么要将原来的paginate方法替换为doPaginate?
bufan
2016-07-27 15:59
而且这一方法会把SQL语句中的order by替换掉。
项目:
JFinal
评论区
JFinal
2016-07-27 16:03
doPaginate 方法是为了方便其它的 paginate 方法重用。 替换掉 order by 的 sql 是用于查询得到 totalRow,查询总量的时候是没必要使用 order by 对结果进行排序的,会损失性能
回复
bufan
2016-07-27 16:25
@JFinal
您说的有道理。但是您替换掉order by之后会导致SQL语句出错。。。
回复
bufan
2016-07-27 16:34
如果可以加一个开关或者是在正则里把加减乘除号也匹配上就好了。目前的状况是正则会匹配并替换掉一部分SQL语句,但是在+附近会中断,导致替换后的SQL语句无法运行。谢谢您!
回复
JFinal
2016-07-27 16:37
@bufan
order by 替换使用的正则无法覆盖掉那些比较偏的用法,例如 order by 中用到一些 sql 函数的情况,造成错误。如果加强正则的匹配能力,则性能急剧下降,所以对于此类 sql,可以使用一下 Db.queryLong(...) 查询总记录数,然后再使用 model.find(...) 方法查询当前页的数据,实现分页的功能。相当于是多写几行代码来代替 paginate 的功能
回复
bufan
2016-07-27 16:37
@JFinal
另外我还有一个问题。在2.2版里,setAttr()方法和getAttrValues()方法为什么会在方法名前加下划线变成_setAttr()和_getAttrValues()?
回复
JFinal
2016-07-27 16:42
@bufan
jfinal 2.2 引入了 BaseModelGenerator,为 model 生成 getter、setter 方法,除了开发者喜欢使用以外,还有一个很重要的原因是支持一些第三方的,依赖于 getter、setter方法的工具或框架。当有了 getter 以后,如果 getAttrValues() 不添加下划线,会被认定为一个 getter 方法来处理,引来一些不必要的问题。
例如 Fastjson 在转换的时候会先将一些常规则 getter 方法得到的数据转成 json,然后再会将 getAttrValues() 得到的数据再转一次,这是没有必要的
回复
bufan
2016-07-27 17:27
@JFinal
您说的这种代替paginate的办法最后还是绕不开paginate这个方法呀,也就是说SQL语句还是会被替换掉ORDER BY然后出错。
回复
JFinal
2016-07-27 17:37
@bufan
绕开了paginate 方法,而是使用 Db.queryLong(...) 以及 model.find(...) 方法查询当前页的内容,前面是手误打错字了,本意是指 "model.find(...)"
回复
bufan
2016-07-27 17:41
@JFinal
find是一个private的方法,在service里面怎么调用它。。。
回复
JFinal
2016-07-27 17:45
@bufan
建议再仔细看一下 model 的 find 方法
回复
bufan
2016-07-27 17:57
@JFinal
搞定啦!谢谢您!
回复
发送
我要反馈
热门反馈
扫码入社