Java 无法使用列名为“的QueryBuilder”`“组”;在奥姆利特

Java 无法使用列名为“的QueryBuilder”`“组”;在奥姆利特,java,sql,h2,ormlite,query-builder,Java,Sql,H2,Ormlite,Query Builder,代码 QueryBuilder<MyClass, String> builder = mnDao.queryBuilder(); builder.where().eq("`GROUP`", someGroup)); QueryBuilder builder=mnDao.QueryBuilder(); builder.where().eq('GROUP`,someGroup)); 抛出异常 表MyClassTable中的未知列名“`GROUP`” 我尝试使用UpdateBuilde

代码

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

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

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

数据库是H2

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

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


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

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


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

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

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

protected static class Reserved {
    public static final String FIELD_NAME_GROUP = "group";
    ...
    @DatabaseField(columnName = FIELD_NAME_GROUP)
    String group;
    ...
}
然后在查询时,使用
字段“NAME”组
,不加任何引号,并执行以下操作:

QueryBuilder<Reserved, Integer> sb = dao.queryBuilder();
sb.where().eq(Reserved.FIELD_NAME_GROUP, "something");
...
QueryBuilder sb=dao.QueryBuilder();
sb.where().eq(Reserved.FIELD\u NAME\u GROUP,“某物”);
...

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

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

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

protected static class Reserved {
    public static final String FIELD_NAME_GROUP = "group";
    ...
    @DatabaseField(columnName = FIELD_NAME_GROUP)
    String group;
    ...
}
然后在查询时,使用
字段“NAME”组
,不加任何引号,并执行以下操作:

QueryBuilder<Reserved, Integer> sb = dao.queryBuilder();
sb.where().eq(Reserved.FIELD_NAME_GROUP, "something");
...
QueryBuilder sb=dao.QueryBuilder();
sb.where().eq(Reserved.FIELD\u NAME\u GROUP,“某物”);
...

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

如果在H2中引用了名称,那么
“\”组\
呢?顺便说一句,“小组”试过了吗?@JoopEggen只是为了确定我试过了“小组”—不可能。“组”也不起作用。最简单的修复方法可能是将列名更改为SQL中不是关键字的名称。@DonRoby你真是天才!我认为sql'ALTER TABLE“MyClassTable”ALTER COLUMN
GROUP
RENAME TO GROUP1'是不可能的,但它是有效的。请将其作为答案发布。如果H2中引用了名称,那么
“GROUP\”
呢?顺便说一句,“小组”试过了吗?@JoopEggen只是为了确定我试过了“小组”—不可能。“组”也不起作用。最简单的修复方法可能是将列名更改为SQL中不是关键字的名称。@DonRoby你真是天才!我认为sql'ALTER TABLE“MyClassTable”ALTER COLUMN
GROUP
RENAME TO GROUP1'是不可能的,但它是有效的。请把它作为答案贴出来。好吧,你的答案并不能解释为什么我的代码不起作用。另外,您所指向的测试用例并不是针对保留字位于sql查询的where部分的情况的测试。不幸的是,我没有时间亲自测试你的答案。请确保我的测试用例能够正常工作。谢谢你提供了很棒的orm工具。不,这并不能解释它。我所能做的就是证明它应该有效。我的测试用例确实使用了
WHERE
中的
select
关键字,但我添加了更多的关键字,使其也使用了
group
,这很好。如果您尝试只使用“group”,请将调试输出发送给我,这样我就可以看到ORMLite生成了什么查询。您的回答没有解释我的代码为什么不起作用。另外,您所指向的测试用例并不是针对保留字位于sql查询的where部分的情况的测试。不幸的是,我没有时间亲自测试你的答案。请确保我的测试用例能够正常工作。谢谢你提供了很棒的orm工具。不,这并不能解释它。我所能做的就是证明它应该有效。我的测试用例确实使用了
WHERE
中的
select
关键字,但我添加了更多的关键字,使其也使用了
group
,这很好。如果您只尝试“group”,请将调试输出发送给我,以便我可以查看ORMLite生成的查询。