当前位置: 首页 > 面试题库 >

在Derby和Hsqldb中转义表和字段名称的问题

庄弘业
2023-03-14
问题内容

我的ORMLite软件包有问题。当我为表生成模式时,我认为这是对所有实体名称进行转义的一种好习惯。这样可以防止某些Java类或字段名称成为SQL保留字:

CREATE TABLE "footable" ("stuff" VARCHAR(255))

我现在要添加“原始”查询支持,以便ORMLite可以帮助用户执行自己的查询。但是,我发现在Derby和Hsqldb中, 如果不
转义,则不能使用实体名称。例如,以下查询:

SELECT * FROM footable

产生以下错误:

Derby: ERROR 42X05: Table/View 'FOOTABLE' does not exist.
Hsqldb: Table not found in statement [select * from footable]

如果选择表也转义为,则效果很好"footable"。无论是否进行转义,ORMLite支持的其他数据库都可以正常运行:MySQL,Postgres,Microsoft
SQL Server,H2和Sqlite。

在Derby和Hsqldb中是否有更好的方法来转义保留字?有关如何以可移植的方式执行此操作的其他想法?

谢谢。


问题答案:

因此,对Bryan带领我走上正轨表示敬意,尽管他的回答不太正确。

事实证明,因为"footable"正如Bryan所说的那样,我当时正在创建数据库,所以创建时将区分大小写。但是,当我对select
footable不带 引号)进行选择时,Derby和Hsqldb会将其全部提升为大写,因此我实际上是在做:

SELECT * FROM FOOTABLE

这不是在没有引号的情况下不区分大小写(本来可以用),而是在没有引号的情况下将实体名称全部大写,然后按大小写进行匹配。我认为这是一个错误…

无论如何,我已经更改了Derby和Hsqldb以大写ORMLite中的所有实体名称,并且一切正常。丑陋的IMO,但可以工作。



 类似资料:
  • 我有一个Spring Boot应用程序,它在HSQLDB中用flyway生成一个模式。 问题是所有表名和列名都转换为大写(TBL_ROLE、ID、NAME)。目的是使db中的名称与我的脚本中定义的名称完全相同。

  • 问题内容: 我有一个使用mysql数据库的应用程序,但是我想在hsqldb内存数据库中运行该应用程序的单元测试。问题是我的某些可持久模型对象具有一些字段,这些字段已注释为columnDefinition =“ TEXT”以强制mysql满足长字符串值,但现在hsqldb不知道TEXT的含义。如果我将其更改为CLOB,则hsqldb很好,但mysql失败。 有没有可用于与mysql和hsqldb兼容

  • 问题内容: 我有一个来自遗留系统的悖论表,我需要对其进行单个查询。字段名称中包含空格-即“街道1”。当我尝试在delphi中仅对“街道1”字段制定查询时,出现错误- 关键字使用无效。令牌:1,行号:1 Delphi V7-对象Pascal,标准Tquery对象名称query1。 问题答案: 您需要在查询中为字符串加上表名的前缀。 例如:字段名称为“ Street 1”,表称为客户,选择为:

  • 问题内容: 有人可以帮我弄这个吗。 我有我的选择查询 我想要选择查询的内容,并在下载csv文件时包含标题,因此我执行了以下查询: 但这给了我这个错误 我想在我下载的csv文件中有这样的输出: 先感谢您。 问题答案: 如错误所示:来自查询的词典包含的键多于您在DictWriter构造函数中指定的字段名称。 一种解决方案是提前对其进行过滤,如下所示: 另一种解决方案是仅使用那些字段来构造查询: 但是,

  • 问题内容: 我想遍历一个表列表。对于每个表,我想运行一个更新查询。 伪代码: 问题答案: 感谢Harpo的回答。我已经使用该想法来构建以下sql语句。我们有许多表50+,它们都具有相同的数据类型(员工ID),但字段名称可能不同。因此,根据表名称,要更新的字段将有所不同。我实际的WHERE和SET语句比本示例要复杂得多,但这对这个问题并不重要。 我首先创建一个临时表来存储要更新的表/字段。 然后,我

  • 问题内容: 我正在尝试使用SQL Server 2008 SSIS将行从Access数据库插入MySQL数据库中。 问题出在定界符上。我正在使用5.1 ODBC驱动程序,并且可以连接到MySql并从ADO.Net目标数据源中选择一个表。在SSIS包编辑器中,所有MySql表均以双引号分隔: 如果表名中有空格,则无法从ADO.NET目标编辑器上的“使用表或视图”文本框中删除双引号或将其替换为其他内容