0

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>();
        } 
}

これは、locationType が 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)
4

1 に答える 1

2

ここでSQL EXISTSを使用したくないと思います。ORMLiteが生成しようとしているクエリには、特別な句は含まれていません。それほどスマートではありません。WHERE

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

このクエリは、場所があればすべてのエントリlocationType == 0を返すことを意味します。Crag

where().in(QueryBuilder)メソッドを使用することをお勧めします。このようにして、タイプが 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)
于 2012-09-10T14:31:01.287 に答える