升级jfinal3.3问题

最近想把原来的1.8项目升级成3.3,再不升级真的落伍了, 但升级过程中出一些问题:

  1.  原来的的类都要继承自BaseXXX<XXX> ? 如 public class Blog extends BaseBlog<Blog>,保持原来1.8的形式不变不行吗?


  2. _JFinalDemoGenerator 中有没有设置想生成的表名的方法(如:addTable)?因为后台数据库有很多(上百个),但我的web项目很小中只用到一部分表,我不想把所有的后台表都自动生成Base类

    有一个addExcludedTable,排除不想生成的表,好像没有上述功能


  3. 原来的ActionInvocation也出现红叉叉了, 

      The import com.jfinal.core.ActionInvocation cannot be resolved


评论区

JFinal

2018-01-16 17:31

1: 保持不变当然是可以的
2:既然想让 model 何持不变,生成器当然就不需要使用了
3:ActionInvocation 更名为了 Invocation,并且换到 com.jfinal.aop 包之下,很容易就改完了

此外,生成器如果希望只生成指定的表, 可以继承一下 MetaBuilder,然后覆盖其中的 isSkipTalbe(String talbe) 来实现,让这个方法返回 true, 就会过滤掉当前的 tabel,控制起来很方便,可以用正则匹配去控制该放行哪些 table,最后再 generator.setMetaBulider(new MyMetaBuilder()) 切换到自定义的实现就可以了

JFinal

2018-01-16 17:32

要升级的话,注意看一下手册的最后一章,里头讲了升级要注意的地方

fox

2018-01-16 17:42

@jfinal 谢谢, 我先看一下文档升级注意事项先.

fox

2018-01-16 17:55

@jfinal @ClearInterceptor 换在 @clear了?

JFinal

2018-01-16 18:11

@fox 没错,一般来说升级 jfinal 大部分要改的就是这种改名之类的,有些功能改变以后,也会有新的功能接替,例如,原来在 Constants.setViewPath(...) 这个功能,被 Routes.setViewPath(...) 接替了,而且功能强大得多

fox

2018-01-17 10:23

@Jfinal DbKit.getConfig("sql2000").getConnection(); 这个也不能用了?

fox

2018-01-17 10:33

可以了, new ActiveRecordPlugin() 时,漏了配置名称

fox

2018-01-17 10:48

com.jfinal.plugin.activerecord.ActiveRecordException: Your should not invoke this method because takeOverDbPaginate(...) will take over it.
XXXX.dao.paginate( curPageNo,pageNum,"id,no" , sql.toString()); 分页这处报错,takeOverDbPaginate怎么用?
升级前是能正常运行的.

JFinal

2018-01-17 12:10

@fox 这个方法的参数变了, copy 过来新版本的代码就好

fox

2018-01-17 17:25

@JFinal 重写一次还是不行,没有红叉,但运行报错, 错误信息如下:

Caused by: com.jfinal.plugin.activerecord.ActiveRecordException: Your should not invoke this method because takeOverDbPaginate(...) will take over it.
at com.jfinal.plugin.activerecord.dialect.AnsiSqlDialect.forPaginate(AnsiSqlDialect.java:197)
at com.jfinal.plugin.activerecord.Model.doPaginateByFullSql(Model.java:382)
at com.jfinal.plugin.activerecord.Model.doPaginate(Model.java:340)

是这样的, 我数据库用的是SQL2000,自定义了一个MyAnsiDialect类:
Config 中这样调用: arpSQL2000.setDialect(new MyAnsiDialect());

MyAnsiDialect 类:
public class MyAnsiDialect extends AnsiSqlDialect {
public void forPaginate(StringBuilder sql, int pageNumber, int pageSize,
String select, String sqlExceptSelect) {
int notInPageNum = (pageNumber-1)*pageSize;
sql.append(" select top ").append(pageSize).append(" ").append(select);
sql.append(sqlExceptSelect).append(" where id not in (");
sql.append("select top ").append(notInPageNum).append(" id ");
sql.append(sqlExceptSelect).append(" order by id desc ");
sql.append(" ) order by id desc ");
System.out.println(sql);
}
...
...
...

}

以上代码哪不对,还是3.3版本针对MS-SQL2000的分页应如何处理?

JFinal

2018-01-17 18:02

@fox 关注点放这里:
1:jfinal 高版本调整了 Dialect 中部分方法的参数
2:而你针对老版本自定义过 MyAnsiDialect ,所以里头的有些方法并没有真正覆盖掉父类的 AnsiSqlDialect 和 Dialect 中的方法,相当于这些方法是不会被调用的

如果用的是 eclipse,查看一下 MyAnsiDialect 类中的方法,定义之处的左侧是不是有一个绿色的小三角形存在,如果不存在,就要修改一下方法签名,变得与父类一样的签名

fox

2018-01-17 18:08

@JFinal看到了,

旧版本:
public void forPaginate(StringBuilder sql, int pageNumber, int pageSize,
String select, String sqlExceptSelect)

新版本: public String forPaginate(int pageNumber, int pageSize,
StringBuilder findSql) 这个方法要重写,正在想怎么处理.

JFinal

2018-01-17 18:25

@fox 如果你自己没有动过这个方法,只需要 copy 新版本中的代码过来就好

fox

2018-01-18 11:13

@jfinal 自已改写forPaginate可以分页了,但如我想用3.3自身的默认的分页功能还是不行.
也就是与 isTakeOverDbPaginate 返回真, 让它接管.
public boolean isTakeOverDbPaginate() {
// TODO Auto-generated method stub
return true;
}

@Override
public boolean isTakeOverModelPaginate() {
// TODO Auto-generated method stub
return true;
}

JFinal

2018-01-18 12:26

你让这个 isTakeOverDbPaginate() 返回 false 才能让 Dialect 接管分页

但你貌似用的 AnsiSqlDialect,这个天然就是要 take over paginate 的,不知道最终希望用哪个

fox

2018-01-18 13:25

@Jfinal 我的意思是用3.3版默认分页不行, 如:

1. 在config中配置如下, 用3.3版本中自带的AnsiSqlDialect (没有自定义AnsiSqlDialect ) :
arpSQL2000.setDialect(new AnsiSqlDialect());

2. 然后在service层中分页处理如下:

XXX.dao.paginate(curPageNo
,pageNum
,"id,name"
,sql.toString());

运行报错,

fox

2018-01-18 14:21

@Jfinal
Model 类:
private Page doPaginate(int pageNumber, int pageSize, Boolean isGroupBySql, String select, String sqlExceptSelect, Object... paras) {
Config config = _getConfig();
Connection conn = null;
try {
conn = config.getConnection();
String totalRowSql = "select count(*) " + config.dialect.replaceOrderBy(sqlExceptSelect);
StringBuilder findSql = new StringBuilder();
// 这里是不是少了个" select " ? ,调试输出的SQL加个" select "就运行正常
findSql.append(' select ').append(select).append(' ').append(sqlExceptSelect);
return doPaginateByFullSql(config, conn, pageNumber, pageSize, isGroupBySql, totalRowSql, findSql, paras);
} catch (Exception e) {
throw new ActiveRecordException(e);
} finally {
config.close(conn);
}
}

fox

2018-01-18 14:32

@Jfinal
如果我要改写Model 类:中的 Page doPaginate() 这个方法,应如何做? 能不能像AnsiSqlDialect 一样,扩展一个自定义Model 出来

JFinal

2018-01-18 16:07

@fox 终极办法是单步调试,看底层到底在怎么运作,其实很容易改的,就是一个分页而已,本质还是运行两条 sql 而已

fox

2018-01-18 17:28

@JFinal 就是单步调试发现Model类中的doPaginate方法出问题, 少了一个' select '
我自已扩展一个AnsiSqlDialect重写doPaginate已经可以分页了,
我想问的是如果用3.3自带的分页对MS-SQL2000是不是还不能很好的支持.

JFinal

2018-01-18 18:00

@fox 都直持好多年了,偶尔有些小问题,例如生成器获取到一些系统表之类的,单步调试再写点代码很容易解决

fox

2018-01-18 22:58

ok,明白了

热门反馈

扫码入社