0

编码

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

抛出异常

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

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

数据库是H2。

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

4

2 回答 2

2

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

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

于 2012-07-07T21:02:48.960 回答
2

正确的答案是根本不做任何引用。 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 单元测试中查找testCreateReserverdTable()testCreateReserverdFields()方法及其关联的类。

于 2012-07-09T14:47:56.237 回答