当使用ORMLite不存在时,如何通过id匹配

时间:2012-09-10 13:29:01

标签: android ormlite

我正在使用Does ORMLITE support SQL EXISTS?

中的建议构建查询
public List<Crag> getAllCragsWithLocation() {
    QueryBuilder<Crag, Integer> cragQueryBuilder = _helper.getCragDao().queryBuilder();
    QueryBuilder<CragLocation, Integer> cragLocationQueryBuilder = _helper.getCragLocationDao().queryBuilder();
        try {
            cragLocationQueryBuilder.where().eq("locationType", 0);
            cragQueryBuilder.where().exists(cragLocationQueryBuilder);
            return cragQueryBuilder.query();
        } catch (Exception e) {
            Log.e(TAG,e.toString());
            return new ArrayList<Crag>();
        } 
}

只要有任何位置类型为0的cragLocation,就会返回所有碎片,无论它们是否有cragLocation。这是可以理解的......

在上面链接的示例中......

QueryBuilder<Visit, Integer> visitQb = visitDao.queryBuilder();
visitQb.where().eq(Visit.CLIENT_ID_FIELD, client.getId());
QueryBuilder<Client, Integer> clientQb = clientDao.queryBuilder();
clientQb.where().exists(visitQb);
List<Client> results = clientQb.query();

我猜这个查询是链接到特定客户端的ID,或者更清楚

select * from client c
    where EXISTS (select * from visit v where c._id = v.client_id)

在我的情况下

select * from Crag c
    where EXISTS (select * from CragLocation cl where c.id = cl.crag_id)

所以我的最终查询是:

select * from Crag c
    where EXISTS (select * from CragLocation cl where c.id = cl.crag_id and cl.location_type = 0)

1 个答案:

答案 0 :(得分:2)

我认为你不想在这里使用SQL EXISTSORMLite要生成的查询包含任何特殊的WHERE子句 - 它不是那么聪明。

cragLocationQueryBuilder.where().eq("locationType", 0);
cragQueryBuilder.where().exists(cragLocationQueryBuilder);

此查询表示如果任何位置locationType == 0,那么它将返回所有Crag条目。

我建议您使用where().in(QueryBuilder) method。这样,您可以返回类型为0的位置的峭壁。

cragLocationQueryBuilder.selectColumns("crag_id).where().eq("locationType", 0);
cragQueryBuilder.where().in("id", cragLocationQueryBuilder);

这将生成类似以下的SQL查询:

select * from Crag
    where id IN (select crag_id from CragLocation cl.location_type = 0)