为什么jdbcTemplate将列名转换为大写?

问题描述

当我希望列名以这种方式返回时,为什么jdbcTemplate会将列名转换为大写?

translate(-50%,-50%)

查找记录,但返回大写名称(例如:BKID,RESTYPE ....)而不是(例如:bkId,restType)。您不需要更改请求中的任何内容。可能是什么问题?数据库oracle

select bkId,restType,printTemplateId,positionNo,isConfirmNeed,isActive from RestTypeBkView order by bkId

解决方法

SQL列名称根据定义不区分大小写。您不能依靠JDBC连接甚至数据库来保留列名的大小写。试试

desc {table_name};

在Oracle上,您将看到以大写形式报告的列名,无论创建表时使用了什么。

Oracle数据库驱动程序通常返回数据库已知的列名(即大写)。如果知道列名称​​应该是什么,则可以随时编写代码以显示更合适的值。

,

首先JDBCTemplate 不会将列名转换为大写

如果您定义了如下查询

String sql = 'SELECT  bkId   FROM tab';

Oracle数据库接收的字符串完全相同(未转换)。

您要解决的点是Oracle数据库中列名称的解释

未加引号的列名被隐式认为是大写。

示例

create table tab 
(bkId number);

select column_name from user_tab_columns where table_name = 'TAB';

COLUMN_NAME                   
------------------------------
BKID

但是如上所述,您可以小写小写和大写

的任意组合引用

以下所有查询都可以,并引用列名BKID

SELECT  bkId  FROM tab;
SELECT  BKID  FROM tab;
SELECT  bkid  FROM tab;

如果您确实想要区分大小写列名,请在创建时用双引号将该列名引起来:

create table tab 
("bkId" number); 

select column_name from user_tab_columns where table_name = 'TAB';

COLUMN_NAME                   
------------------------------
bkId

但是请三思而行,如果这确实是您想要的,因为此查询现在将失败

SELECT  bkId  FROM tab;

ORA-00904: "BKID": invalid identifier

您必须引用列名才能选择它:

SELECT "bkId"  FROM tab;
,
Solution:
   <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>

请参见org.springframework.core包CollectionFactort.java

/** Whether the Commons Collections 3.x library is present on the classpath */
    private static final boolean commonsCollections3Available =
            ClassUtils.isPresent("org.apache.commons.collections.map.CaseInsensitiveMap",CollectionFactory.class.getClassLoader());
/**
     * Create a linked case-insensitive Map if possible: if Commons Collections
     * 3.x is available,a CaseInsensitiveMap with ListOrderedMap decorator will
     * be created. Else,a JDK {@link java.util.LinkedHashMap} will be used.
     * @param initialCapacity the initial capacity of the Map
     * @return the new Map instance
     * @see org.apache.commons.collections.map.CaseInsensitiveMap
     * @see org.apache.commons.collections.map.ListOrderedMap
     */
    public static Map createLinkedCaseInsensitiveMapIfPossible(int initialCapacity) {
        if (commonsCollections3Available) {
            logger.trace("Creating [org.apache.commons.collections.map.ListOrderedMap/CaseInsensitiveMap]");
            return CommonsCollectionFactory.createListOrderedCaseInsensitiveMap(initialCapacity);
        }
        else {
            logger.debug("Falling back to [java.util.LinkedHashMap] for linked case-insensitive map");
            return new LinkedHashMap(initialCapacity);
        }
    }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...