batchSave()方法: postgre数据库解析有问题

JfinalConfig.class
	/**
	 * 配置插件
	 */
	@Override
	public void configPlugin(Plugins me) {
		//sqlserver
		DruidPlugin dsSqlServer= new DruidPlugin(getProperty("jdbcUrl3"), getProperty("username3"), getProperty("password3").trim());
		dsSqlServer.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        me.add(dsSqlServer);
        ActiveRecordPlugin arpSqlServer = new ActiveRecordPlugin("sqls",dsSqlServer);
        arpSqlServer.setDialect(new SqlServerDialect());  
        me.add(arpSqlServer);
		//postgre
    	DruidPlugin  dsPost  = new DruidPlugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"));
		dsPost.setDriverClass("org.postgresql.Driver");
		me.add(dsPost);
		ActiveRecordPlugin arpPost = new ActiveRecordPlugin("post",dsPost);
		arpPost.setDialect(new PostgreSqlDialect());
		me.add(arpPost);

	} 

----------------------------
执行类方法
         Object count = Db.use("sqls").query("select count(1)  from  "+tablename);
         System.out.println("count "+count);
         List<Record> list =Db.use("sqls").find("select top "+num+" * from  "+tablename );
         System.out.println(list.size());
        
         Db.use("post").batchSave(tablename, list, num);

报错如下:

blob.png

单步调试结果:(用的确实是postgre数据库的方言,但是编译之后不支持插入)

blob.png


评论区

JFinal

2016-12-02 16:37

把这条 sql copy出来,放在控制台能否被正确执行?

静静滴疯

2016-12-02 16:38

@JFinal 在数据不能直接执行,把双引号都去了就可以直接运行

JFinal

2016-12-02 16:41

@静静滴疯 也就是说你的 postgresql 不支持双引号对吧? 解决办法极其简单
1:创建一个public class MyPostgresqlDialect extends PostgresqlDialect,将父类的所有代码 copy 进来,然后将双引号去掉

2:arp.setDialect(MyPostgresqlDialect());

这个问题,可能是你的 postgresql 配置问题,默认是支持双引号的

JFinal

2016-12-02 16:48

@静静滴疯 我再补充一下,jfinal 生成的 sql 对不同的数据库会在字段名称前后添加不同的转义字符,例如 myslq 是添加 "`",postgresql 是添加 """,这样处理是为了使用字段名可能支持数据库保留字

postgresql 处理保留字的方式就是对字段加双引号,你的 postgresql 不支持双引号,我也是头一回碰到,闻所未闻

静静滴疯

2016-12-02 17:18

@JFinal 嗯我调查到原因了,因为我的postgre数据库中的字段是小写的,然后语句是加了双引号的大写,就不支持了,,我又重新创建了数据库,全部用的大写,就全部通过了。谢谢指导~

潇洒太爷

2016-12-03 23:08

@静静滴疯 postgre数据库,字段加上引号就是区分大小写,不加上引号就是不区分大小写,你可以使用波总的方法,MyPostgresqlDialect上吧所有的引号去掉就完全没问题了。

静静滴疯

2016-12-05 08:57

@潇洒太爷 恩恩,这个知识之前欠缺,现在了解了,谢谢。

热门反馈

扫码入社