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了

    若言琴上有琴声,放在匣中何不鸣; 若言声在指头上,何不于君指上听。
  • 相关阅读:
    关于SQL Server将一列的多行内容拼接成一行的问题讨论
    Win7 disk.sys无法加载的问题
    mvel2.0语法指南
    让网页不被缓存的解决办法
    让html页面不缓存js的实现方法
    mysql中间件研究(tddl atlas cobar sharding-jdbc)
    jdk环境变量设置理解
    the import cannot be resolved
    Oracle解除表锁定问题
    windows系统中软件开发常用的软件
  • 原文地址:https://www.cnblogs.com/xkms/p/4632836.html
Copyright © 2011-2022 走看看