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?