正确使用ORMLite中的Where查询for android

时间:2014-02-16 16:52:34

标签: android ormlite ormlite-servicestack

我正在尝试通过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')

1 个答案:

答案 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:

  

http://ormlite.com/docs/building-queries