Jfinal的DbPro.java,遇到order by 后面有【?】 的情况下,会有个bug,建议加行代码.

建议在jfinal的DbPro.java文件里的第72行,加入如下代码:

if(sql.indexOf("\\?") == -1) {paras = new Object[0];}

理由是:我写的SQL:

String sql = select  *  from member order by ? desc;

调用分页函数Member.dao.paginate("select  * "," from member order by ? desc" , ctime);

代码执行到DbPro.java的72行时,会报bug.代码如下:


 72行    dialect.fillStatement(pst, paras);



fillStatement的方法是:因为pst对象里的SQL(select count(*) from member)没有【?】,但是paras的有值length>0,所以会报一个异常:意思是,我没有【?】,所以不需要参数,结果你却给传了参数;

public void fillStatement(PreparedStatement pst, Object... paras) throws SQLException {

for (int i=0; i<paras.length; i++) {

pst.setObject(i + 1, paras[i]);

}

}


我给自己项目里加了代码改好了。

blob.png


评论区

韦甩甩

2016-08-16 19:39

错了,是改成这个if(sql.indexOf("?") == -1) {paras = new Object[0];}

JFinal

2016-08-16 23:25

order by 应该是不支持问号占位的,所以这个问题或许不存在

韦甩甩

2016-08-17 10:46

@JFinal 嗯对,我试了一下,看了一下排序,确定不支持,我错了,看来只能手打了。因为有个需求是,根据价格,时间,销量上下排序,本打算用order by ? desc/asc。哎......3Q,成长了。Jfinal很犀利的框架,我喜欢。

JFinal

2016-08-17 11:22

@韦甩甩 感谢支持 jfinal 发展,多多关注社区动态,近几天社区会有很大改进

韦甩甩

2016-08-23 16:27

@JFinal String select = "SELECT " +
" sm.messageId, " +
" sm.messageTitle, " +
" sm.messageText, " +
" isShowRedDot(?,sm.messageId) as isShowRedDot, " +
" sm.mtime ";

String sqlExceptSelect = "FROM " +
" system_message AS sm " +
"WHERE " +
" sm.messageStatus = 1";
return SystemMessage.dao.paginate(pageNumber, 10, select, sqlExceptSelect, memberId);

Jfinal的分页,貌似where前面的SQL 不支持 占位符,我写了个函数isShowRedDot需要传memberId,但是,在DbPro.java的72行,也就是,执行 select count(*)算中记录数的时候
PreparedStatement pst = conn.prepareStatement(sql);
config.dialect.fillStatement(pst, paras);
报参数数组越界,因为在占位符,没有写在 where语句后面,而是where语句前面。
所以我在上面两行代码里追加了一行代码:
if(sql.indexOf("?") == -1) {paras = new Object[0];}
意思是,如果这条SQL没有占位符,我就把数组变成空数组;
代码就能执行成功了。我不清楚这是不是bug,还是,我的也写法有问题。我这么一改,我在调用分页功能的时候,可以在where语句前面,写占位符?传参了。

JFinal

2016-08-23 16:31

JDBC 只支持 where 后面的参数占位符,为啥还要在参数之外使用呢?很明显你在 select 之中用了占位符,这是一定要报错的

hunter_wei2015

2016-09-22 14:43

我刚刚发现一个问题,我的数据大概有10000条,每页十条数据;在分页的时候使用了order by create_time desc ;然后取出的数据前两页还是正常的,后面的数据就和前面的数据是一样的;;;不知道这是不是一个bug?

hunter_wei2015

2016-09-22 14:45

@Override
public Page BaseDrugInfo_ch(int page, int size, String key) {
String select_sql = "select * ",from_sql = "";
if(StrKit.isBlank(key)){
from_sql = "from sys_drug_list_ch order by create_time desc";
}else{
from_sql = "from sys_drug_list_ch where (DRUG_NAME like '%"+key+"%' or DRUG_COMMON_NAME like '%"+key+"%') order by create_time desc";
}
Page list = find(page, size, select_sql, from_sql);
return list;
}

JFinal

2016-09-22 15:27

@hunter_wei2015 建议先设置一下 arp.setShowSql(true) 将 sql 输出到 eclipse/IDEA 控制台,然后在用 mysql 客户端执行一下这些 sql,看结果是什么

热门反馈

扫码入社