我正在尝试通过ormlite生成where查询。
例如:Where name='Ärer' and (type='tt1' or type='tt2')
但结果总是像这样
SELECT * FROM `Test` WHERE ((((((`name` = 'Arer' AND `type` = 'tt1' ) OR `type` = 'tt2' ) OR `type` = 'tt3' ) OR `type` = 'tt4' ) OR `type` = 'tt5' ) )
这是我用来生成上述查询的java代码
Where<Test, Integer> whereStatement = queryBuilder.where();
int cnt = 0;
String[] channelArray = getChannelSettingsForDB();
whereStatement.eq(NAME, "Arer")
.and();
for (String channel : channelArray) {
if (channel != null) {
whereStatement.eq(TYPE, channel).or();
}
请让我知道正确的使用方法,以生成像这样的
这样的地方查询Where name='Ärer' and (type='tt1' or type='tt2' or type='tt3' or type='tt4' or type='tt5')
答案 0 :(得分:1)
但结果总是像这样
...或
type
='tt2')或type
='tt3'...
每次ORMLite添加and()
或or()
时,它都会添加括号以特定于和/或参数。这些方法采用前一个子句,然后在提交的下一个子句中执行操作。
在您的情况下,第一个子句是eq(NAME, "Arer")
,它与第一个eq(TYPE, channel)
一起获得。这不是你想要的。
请让我知道正确的使用方法来生成像这样的where查询...
有几种方法可以让你做你想做的事。第一种方法使用where.or(int)
功能,它吸收了许多条款,并通过OR
分隔。
whereStatement.eq(NAME, "Arer");
int channelCount = 0;
for (String channel : channelArray) {
if (channel != null) {
whereStatement.eq(TYPE, channel);
channelCount++;
}
}
if (channelCount > 0) {
// or the last X clauses together
whereStatement.or(channelCount);
// and the channel ORs with the name
whereStatement.and(2);
}
但是,您可以考虑使用where.in(...)
方法。它不会处理空值,因此您必须将数组复制到列表或其他可迭代中:
List<String> channels = new ArrayList<String>(channelArray.length);
for (String channel : channelArray) {
if (channel != null) {
channels.add(channel);
}
}
if (!channels.isEmpty()) {
// the IN replaces a bunch of ORs
whereStatement.in(TYPE, channels);
// and the channel IN with the name
whereStatement.and(2);
}
有关构建查询的各种不同方法,请RTFM: