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了

    若言琴上有琴声,放在匣中何不鸣; 若言声在指头上,何不于君指上听。
  • 相关阅读:
    [转].NET委托:一个C#睡前故事
    有关睡觉的学问
    [转]电话号码规范化规则正则表达式
    验证邮件地址的正则表达式
    初学UML之用例图
    没有不可突破的系统……
    生成树协议Spanning Tree Protocol
    两种图片漂浮的代码
    转:静态路由实际应用
    Cisco 2600 NAT 配置 实例
  • 原文地址:https://www.cnblogs.com/xkms/p/4632836.html
Copyright © 2011-2022 走看看