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了