使用mybatis连接oracle数据库进行查询,最好确保表命全大写,否者会出现ORA-00904: invalid identifier的问题
注:本人使用的mybatis版本是3.0.5
二、问题描述:
我使用ibator工具产生的代码,有一个Dao的测试类,但是一执行就出现了ORA-00904: invalid identifier,如图:
原因分析,大部分情况下是由于引用了不存在的列名导致的。 解决的办法就是检查自己引用的列名称是否一致。对于某些工具生成的sql,可能导致列名称和期望不符的情况,比如,有些工具生成的列名称会带双引号,从而导致此错误。
经过查询和本人的实践验证,oracle执行查询时(这里以11g为例),对于特殊的字段命名有着非常严格的语法要求,如果是字段名称按照单词首字母大写的规范进行命名,在进行条件查询的时候必须,字段名称必须与原来命名一样并且要加上双引号,否则会包ORA-00904: invalid identifier。以下是本案例的测试截图:
表结构:
执行查询:
从执行的结果可以知道,最终oracle在执行sql语句的时候把条件查询的字段名转成了全大写,遇到表中没有找到相关的字段(区分大小写),就出现了此错误。查询指定字段的值也是如此:
表结构:
执行查询:
三、解决办法
总结:
3.1oracle在执行sql语句进行查询的时候,默认的情况下(查询的时候不给字段加双引号),会将字段名称转换成全大写之后再到表中进行匹配查询,比如:执行select from dept where id=1,则实际执行的是:select from DEPT where ID=1,这里表名和字段名全部都会转成全大写去匹配查询,一旦匹配不到(真正匹配字段名和名的时候区分大小写),则会报错误。
3.2如果设计表的时候不想表名和字段名都全大写,则在进行查询的时候需要在表名或者字段名称加上双引号(相当于告知oracle不要对sql语句中指定的表名或者字段名转成全大写),并且区分大小写,这样执行查询才不会发生错误。
##解决方法##
因此解决的办法就是,在给字段名称进行命名的时候,建议全大写,对于表名也是全大写命名,这样不管是进行条件查询还是查询指定字段的名称的时候,都不需要严格区分大小写了并且还要加上双引号了,Oracle会自动帮你先转成全大写之后再进行匹配查询。