2012-09-10 27 views
0

我建設使用的建議我的查詢從Does ORMLITE support SQL EXISTS?使用ORMLite凡NOT 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>(); 
     } 
} 

,無論他們是否有cragLocation的這會將所有的峭壁,只要有任何cragLocation時如何通過ID相符與0這是可以理解一個的locationType ...

在上面鏈接的例子...

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

我想查詢鏈接到SPE的id在我的情況cific客戶端或者更明確地

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) 

回答

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)