【问题标题】:Cannot use QueryBuilder with column name = "`GROUP`" in ormlite无法在 ormlite 中使用列名 =“`GROUP`”的 QueryBuilder
【发布时间】:2012-07-07 20:00:16
【问题描述】:

代码

QueryBuilder<MyClass, String> builder = mnDao.queryBuilder();
builder.where().eq("`GROUP`", someGroup));

抛出异常

“表 MyClassTable 中的未知列名 '`GROUP`'”

我尝试使用 UpdateBuilder 中的 escapeColumnName(),但结果是一样的。 我可以使用原始查询,但它们不安全,因为它们不提供占位符。

数据库是H2。

它看起来像 ormlite 中的一个错误。 有什么建议吗?

【问题讨论】:

  • "\"GROUP\"" 怎么样,因为名称在 H2 中是这样引用的? BTW "GROUP" 试过了吗?
  • @JoopEggen 只是为了确保我已经尝试过 "\"GROUP\"" - 没办法。 “GROUP”也不起作用。
  • 最简单的解决方法可能是将列名更改为不是 SQL 中的关键字。
  • @DonRoby 你是天才!我认为 sql 'ALTER TABLE "MyClassTable" ALTER COLUMN GROUP RENAME TO GROUP1' 是不可能的,但它确实有效。请将其发布为答案。

标签: java sql h2 ormlite query-builder


【解决方案1】:

正确的答案是根本不做任何引用。 ORMLite 自动引用所有字段和表名称。这肯定非常依赖于数据库,但 H2 是我的主要测试数据库,所以我确信它在我所知道的所有情况下都能正常工作。至于为什么它对你不起作用,我无法评论。如果您发布 ORMLite 生成的查询,我可能会看到问题。

推荐的模式是将要在查询中使用的任何列定义为公共字符串。例如:

protected static class Reserved {
    public static final String FIELD_NAME_GROUP = "group";
    ...
    @DatabaseField(columnName = FIELD_NAME_GROUP)
    String group;
    ...
}

然后,当您查询时,您可以使用 FIELD_NAME_GROUP 而不使用任何引用并执行以下操作:

QueryBuilder<Reserved, Integer> sb = dao.queryBuilder();
sb.where().eq(Reserved.FIELD_NAME_GROUP, "something");
...

我在几个单元测试中对此进行了很好的介绍。请参阅我在所有受支持的数据库类型上运行的以下测试。在JdbcBaseDaoImplTest.java unit test 中查找testCreateReserverdTable()testCreateReserverdFields() 方法及其关联类。

【讨论】:

  • 好吧,您的回答并没有解释为什么我的代码不起作用。此外,您指向的测试用例看起来不像保留字在 sql 查询的 WHERE 部分中的情况的测试。不幸的是,我没有时间亲自测试您的答案。只要确保我的测试用例能够正常工作。感谢您提供出色的 orm 工具。
  • 不,它没有解释它。我所能做的就是证明它应该有效。我的测试用例确实WHERE 中使用了select 关键字,但我添加了更多内容,让它也使用group,效果很好。
  • 如果您只尝试“组”,请将您的调试输出发送给我,以便我查看 ORMLite 生成的查询。
【解决方案2】:

我不知道 ormlite,它应该有一种引用名称的方式,允许您使用奇数表名,但解决此类问题的最简单方法是避免使用sql关键字作为表名或列名。

如果您可以将表名更改为 sql 不用于其他内容的名称,那么它可能会正常工作。

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多