springdatajpa使用informix数据库出现no such column 异常的问题

本博客属原创,转载请注明出处

问题描述:

      环境:

          spring data jpa版本4.0.3

          informix驱动版本3.50.JC9

      程序结构

          jpa配置文件对应的jdbc配置

              

          dao层继承jpaRepository

              

         TfaAlgRec实体类,以id属性为例,此时@Column(name="Id")

               

          测试类:

              

 此时会报

       

 

紧接着用jdbc的方式将tfa_alg_rec这张表的列名打印出来

 

console输出:

 

可以看到数据库表中的id是小写,而实体中用@Column注解配置的是Id。于是乎,把上面@Column注解配置改成id。此时运行却没有报异常。

但众所周知,informix数据库执行sql时是不区分大小写的,所以这很矛盾。上网查资料,原来是hibernate连接informix的时候有个bug,网址:

https://hibernate.atlassian.net/browse/HBX-1126

解决方式:

        在jpa配置文件中将url中DELIMIDENT=y这个配置去掉,如下

<property name="url" value="jdbc:informix-sqli://127.0.0.1:8001/nmosdb:INFORMIXSERVER=nrmsserver;informixserver=nrmsserver;newcodeset=gbk,cp1252,819;" />

 之后再把实体中id属性配置的列名改回成@Column(name="Id")。运行单元测试,成功

 

分析原因可能是:

  首先简单介绍下DELIMIDENT这个属性,它是一个定界符,当设置了 DELIMIDENT 时,SQL 解析器将以单引号定界的字符串解释为字符串文字,而将双引号 ( " ) 定界的字符串解释为 SQL 标识。在本例中,url加上DELIMIDENT=y配置时,程序后台可能在执行sql时,将列名加上双引号如: select "Id" from tfa_alg_rec,这样的话数据库会去找列名为"Id"的列,显然没有;如果去掉这个配置,执行的sql就是select Id from tfa_alg_rec,这里列名虽叫Id,但不区分大小写,数据库会自动配置id这个列,这样就ok了

 

posted @ 2015-07-09 12:51  闲看漫随  阅读(1266)  评论(0编辑  收藏  举报