HSQL中的区分大小写的列名称

时间:2014-02-18 21:27:47

标签: groovy hsqldb case-sensitive in-memory-database

我最终试图测试一个常规的SQL查询。我们的想法是使用groovy来执行一个sql查询,该查询将从旧的MS SQL数据库中提取一些数据,并以我的应用程序可以使用的格式返回它。编写groovy脚本很简单,但测试它是另一回事。目前我正在使用hypersonic来创建内存数据库以进行测试。当我的测试运行时,我创建一个表并尝试使用xml文件中的一些测试数据填充它。表创建工作正常,但数据插入失败的原因是:“用户缺少权限或找不到对象:GROUP”。

问题似乎是hsql将我的所有列名转换为大写。因此,即使实际列名称为“Group”,它也会被转换为insert语句的“GROUP”。 GROUP与group关键字冲突,因此查询失败。

我无法控制旧版DB中的列名,因此我需要某种解决方法。有没有办法配置hsql来阻止列名转换?

更新 下面是一些示例代码,显示了我在groovy中要做的事情:

首先,我有一个在测试数据库中创建表的初始化方法

Sql remoteDB;
...
remoteDB.execute(
                """create table INFO_GROUP(
"Group" varchar(2) not null primary key,
VALUE varchar(3) null,
GROUP_DATE datetime null,
COMMENT varchar(25) null
)""");

创建表后,我会解析xml文件中的一些数据并将其注入我创建的表中:

groovy.sql.DataSet set = remoteDB.dataSet(tableName);               
Node n = it;
Map<String,Object> m = n.attributes() ;
assert(set!=null);
set.add(m);

我看到的问题是我调用set.add(m)的最后一行。我收到一个错误:

  

执行失败:插入INFO_GROUP(Group,VALUE,GROUP_DATE,   COMMENT)值(?,?,?,?)因为:用户缺少权限或对象   找不到:GROUP

1 个答案:

答案 0 :(得分:1)

HSQLDB在双引号时保留“组”的情况。 INSERT语句必须双引“组”列名称,在这种情况下它不会这样做。

create table INFO_GROUP("Group" varchar(2) not null primary key, VALUE varchar(3) null,
    GROUP_DATE datetime null, COMMENT varchar(25) null)

insert into INFO_GROUP ("Group", VALUE, GROUP_DATE, COMMENT) values ? , ? , ? ,?

事实证明,单词Group必须与Groovy中的地图中的双引号"Group"一起使用才能生成正确的INSERT语句。