在JFinal2.2中为什么要将原来的paginate方法替换为doPaginate?

而且这一方法会把SQL语句中的order by替换掉。

评论区

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 搞定啦!谢谢您!

热门反馈

扫码入社