Jfinal3.2 使用Sqlite3Dialect方言后getBoolean函数出错

项目原来使用的是mysql数据库,没有任何问题,客户提出想使用Sqlite数据库,按照步骤,把Sqlite3Dialect方言加入,并加入sqlite.jdbc依赖库,程序能正常运行,但是原来在mysql中用tinyint(1)定义的布尔变量现在没法取数据了,报异常。
代码如下:

boolean flag=re.getBoolean("is_show");  //在mysql下正确,在sqlite下报错

jfinal调用代码如下

/**

* Get attribute of mysql type: bit, tinyint(1)

*/

public Boolean getBoolean(String attr) {

return (Boolean)attrs.get(attr);

}

报错如下:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean at com.jfinal.plugin.activerecord.Model.getBoolean(Model.java:277)

请问有啥办法解决?谢谢!

@jfinal

评论区

JFinal

2018-01-14 21:23

先试试升级到 jfinal 3.3 看解决问题没有

如果没有解决,就在升级到 jfinal 3.3 的基础之上,通过 Sqlite3Dialect.setModelBuilder(...) 以及 setRecordBuilder(...) ,将 ModelBuilder、RecordBuilder 替换成自己的实现

自己的实现类似于下面的方式:
public class MyModelBuilder extends ModelBuilder {
...
}
在 if 分支里头添加一个分支,判断一下:
if (types[i] == Types.BOOLEAN) {
value = rs.getBoolean(i);
}

JFinal

2018-01-14 21:24

同样的,RecordBuilder 也要这么扩展一下。 jfinal 自从 jfinal 3.3 开始,开放了 Dialect 的 setModelBuilder 与 setRecordBuilder 接口,可以自由定制如何从 JDBD 来读取数据

rirai

2018-01-16 09:10

@JFinal 谢谢波总的解答,我先试试看,有问题再咨询。

rirai

2018-01-16 16:19

@JFinal 波总,我试了jfinal3.3问题没有解决,然后用你的方法,写了一个MyModelBuilder类,但是编译没有通过,请教一下问题出在哪里?
public class MyModelBuilder extends ModelBuilder {

@SuppressWarnings({"rawtypes", "unchecked"})
@Override
public List build(ResultSet rs, Class modelClass) throws SQLException, InstantiationException, IllegalAccessException {
List result = new ArrayList();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String[] labelNames = new String[columnCount + 1];
int[] types = new int[columnCount + 1];
buildLabelNamesAndTypes(rsmd, labelNames, types);
while (rs.next()) {
Model ar = modelClass.newInstance();
Map attrs = ar._getAttrs();
错误发生在 ar._getAttrs();
错误提示:The method _getAttrs() from the type Model is not visible

JFinal

2018-01-16 16:23

@rirai 以 TimestampProcessedModelBuilder.java 以及 TimestampProcessedRecordBuilder.java 这两个类为蓝本去写,代码在此:
https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/plugin/activerecord/builder/TimestampProcessedModelBuilder.java

将这两个类的代码 copy 出来, 然后自己再改改就可以了

JFinal

2018-01-16 16:23

这两个类里头有关 ar._getAttrs() 是有处理办法的,仔细看一下,是用的 CPI 模式

rirai

2018-01-16 16:31

好的,学习一下

rirai

2018-01-16 20:57

终于搞定了!完全模仿着写就可以了,jfinal真是好用!赞一个。

JFinal

2018-01-16 22:11

@rirai enjoy 引擎用起来, enjoy 是今年反馈最多用着爽的 jfinal 功能模块

热门反馈

扫码入社