zoukankan      html  css  js  c++  java
  • 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了

    若言琴上有琴声,放在匣中何不鸣; 若言声在指头上,何不于君指上听。
  • 相关阅读:
    iOS 有用的代码片段
    iOS 限制软盘输入法
    UIlabel 遇到\n 换行iOS
    关于delegate 与 protocol 的理解 iOS
    ios 跳转到app store
    iOS 上下左右滑动手势
    求某段程序运行的高精度时间
    转载——GDB中应该知道的几个调试方法
    文章翻译——使用 GNU 的 GDB调试器,内存布局和栈——01
    第十章扩展——__cdecl 的压栈方式——printf
  • 原文地址:https://www.cnblogs.com/xkms/p/4632836.html
Copyright © 2011-2022 走看看