【问题标题】:Case Sensitive Column Name in HSQLHSQL 中区分大小写的列名
【发布时间】:2014-03-18 21:55:33
【问题描述】:

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

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

我无法控制旧数据库中的列名,因此我需要某种解决方法。有没有办法配置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) 值 (?, ?, ?, ?) 因为:用户缺乏权限或对象 未找到:组

【问题讨论】:

  • HSQLDB 在双引号中保留“组”大小写。 INSERT 语句必须双引号“组”列名,在这种情况下它没有这样做。了解如何让 Groovy 使用正确的表单。
  • Groovy 正在委托给 HSQL,因此要更改表单,我必须在 HSQLDB 中找到一个设置,让我可以控制列名的区分大小写。有人知道怎么做吗?
  • 事实证明 fredt 的想法是正确的。问题并非如此,而是缺少引号。一旦我添加了一些代码来用双引号将“组”键包装在我的地图中,问题就消失了。如果您将评论作为答案发表,我会将其标记为解决方案。谢谢!

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


【解决方案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 ? , ? , ? ,?

事实证明,在 Groovy 的映射中,Group 这个词必须与双引号 "Group" 一起使用,才能生成正确的 INSERT 语句。

【讨论】:

    猜你喜欢
    • 2014-09-06
    • 1970-01-01
    • 2012-05-13
    • 2014-01-19
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多