2013-08-09 12 views
5

Sto tentando di eseguire una query in una tabella in base ai criteri di una tabella di join utilizzando ORMLite.ORMLite o query su più tabelle

Ecco come vorrei esprimere la query che sto cercando di scrivere in TSQL:

select * from media m inner join file f on m.fileId = f.fileId 
where m.isNew = 1 OR f.isNew = 1 

Il risultato dovrebbe essere un elenco di record di mezzi in cui o il record di supporto o il record file corrispondente ha isNew = 1

Ho letto la documentazione sull'uso di OR in ORMLite, ma tutti gli esempi utilizzano una singola tabella, non unendo. Allo stesso modo, ho letto la documentazione sui join, ma nessuno degli esempi include una clausola where che si estende su entrambe le tabelle. C'è un modo oltre a una query grezza per fare questo?

Ho dato un'occhiata a questa domanda: https://stackoverflow.com/a/12629645/874782 e sembra chiedere la stessa cosa, ma la risposta accettata produce una query AND, non un OR. Ecco il mio codice che ho usato per testare questa teoria:

public List<Media> getNewMedia() { 
    Session session = getSession(); 
    Account account = session.getSelectedAccount(); 
    ContentGroup contentGroup = account.getSelectedContentGroup(); 

    List<Media> results = null; 

    try { 

     QueryBuilder<Category, Integer> categoryQueryBuilder = getHelper().getCategoryDao().queryBuilder(); 
     categoryQueryBuilder.where().eq("group_id", contentGroup.getId()); 

     QueryBuilder<MediaCategory, Integer> mediaCatQb = getHelper().getMediaCategoryDao().queryBuilder(); 
     mediaCatQb = mediaCatQb.join(categoryQueryBuilder); 

     QueryBuilder<FileRecord, Integer> fileQueryBuilder = getHelper().getFileDao().queryBuilder(); 
     fileQueryBuilder.where().ge("lastUpdated", contentGroup.getLastDownload()); 

     QueryBuilder<Media, Integer> mediaQb = getHelper().getMediaDao().queryBuilder(); 
     mediaQb.where().eq("seen", false); 
     // join with the media query 
     results = mediaQb.join(fileQueryBuilder).join(mediaCatQb).query(); 

    } catch (SQLException e) { 
     Log.e(TAG, "Sql Exception", e); 
    } 

    return results; 
} 

Per il bene di completamento, questo è query per un esempio un po 'più complesso di quello che ho dato sopra, questo espresso in tsql sarebbe

select * from Media m join FileRecord f on m.fileRecordId = f.fileRecordId 
where m.seen = false OR f.lastUpdated >= lastUpdateDate 

Quando lo eseguo, in realtà sta eseguendo una query AND, che è ciò che mi aspetterei in base a due join con clausole where indipendenti.

Penso che il problema chiave è che una clausola where è intrinsecamente legata a una tabella, poiché viene eseguita su un oggetto QueryBuilder che proviene da un Dao specifico per tale tabella. Come posso aggirare questo?

risposta

0

Penso che quello che stai cercando è joinOr cercare nel ORMLite docs.

Come join (QueryBuilder), ma questo unisce le dichiarazioni, ove di due generatori di query SQL con "OR".

Problemi correlati