jfinal连接postgresql数据库中使用Db.findById问题咨询

波总您好,初学jfinal,尝试使用postgresql数据库,再使用Db.findById的时候发现个问题,在postgresql数据库中我建了一个叫“test”的模式,如下图所示

图片.png

使用下图两个语句执行sql,发现第二条语句通过jfianl解析出来的无法执行,原因是因为通过postgresqldialet解析成Sql: select * from "test.test_table" where "id" = ?   ,如果修改成select * from "test"."test_table" where "id" = ?可以执行即需要使用类似Db.findById("test\".\"test_table",1)这种可以执行,或者不加双引号也能执行,也就是在使用Db.findById的时候能否支持第一个参数里有模式名的情况

图片.png

评论区

JFinal

2016-12-04 17:44

创建一个 public class MyDialect extends PostgreSqlDialect,然后 copy 出父类所有代码,将其中的双引号去掉,最后再 arp.setDialect(new MyDialect()) 用自定义的 MyDialect 替换官方提供的即可打完收工

记得搞定后回来分享一下

不想起哄

2016-12-04 18:11

@JFinal 这种方法确实能解决这个问题,但是感觉治标不治本,有以下几个问题望波总能帮忙解答,谢谢。
1.在jfianl内部为什么会做出在tablename和columnname中做出加双引号的处理,这个处理是必须的吗,这个问题也是我对postgresql了解不深入,希望能帮忙简单解答下;
2.即便是我这样做了,我的自己的程序问题解决了,如果别人也遇到了这个问题也需要这样做,那么是否可以考虑从jfinal内部解决呢?
3.假设以后某一版本的jfinal内部对PostgreSqlDialet进行了修改,增加或者删除了某个方法,那么在不知情的情况下升级之后是否会对本地程序有影像,存在这种未知的风险

JFinal

2016-12-04 23:04

@不想起哄 加双引号是为了让表字段、表名支持数据库保留字,例如有些数据库的字段名不能使用 user、right 这样的单词

jfinal 内部解决也是可以的,只不过要在生成方言时去判断你贴出来的代码中的 test.test_table 这种情况,实现起来不仅代码不优雅,而且会有点性能损失,jfinal 倾向于通过扩展方式解决个性化需求

假定某一版本对 PostgreSqlDialect 进行了修改,有可能会有影响,但方言这种东东,几乎不会改,非常稳固,即便是改了,也是一两行代码,可以很快跟上升级的步伐

热门反馈

扫码入社