I have in my application a relationship that is designed like this: and I'm trying to select all the chats that have at least one user as a friend.
basically, I want to execute this query:
SELECT c.* FROM CHAT c, USER u, UserChats uc
WHERE c.type = myType
AND u.isFriend = 1
AND c.id = uc.chatId
AND u.id = uc.userId
I haven't managed to find a way to execute this in the GreenDao libraries and was hoping someone will be able to help me with this.
EDIT:
This is what I have up to now:
List<UsersChats> list = usersChatsDao.queryDeep(
"WHERE T0." + UserDao.Properties.isFriend.collumnName + " = ? "+
"AND T1." + ChatDao.Properties.type.collumName + " = ?",
new String[] {"1", myType});
if(list != null && list.isEmpty() == false) {
List<Chat> chats = new ArrayList<Chat>();
for(UsersChats link : list) {
chats.add(link.getChat());
}
}
Since grrendao doesn't implement QueryBuilder.join()
-methods at the moment, I think your solution is one of the best you can get right now, as it uses joins internally.
There are only minor drawbacks to it:
listLazy()
Another way would be to use some query like this (presumed IsFriend
is an int-column
and myType
fits to ChatDao.Properties.type
:
Query<Chat> qc = chatDao.queryRawCreate(
" LEFT JOIN "+UserChatsDao.TABLENAME+" UC"+
" ON T."+ChatDao.Properties.id.columnName+"=UC."+UserChats.Properties.chatId.columnName+
" LEFT JOIN "+UserDao.TABLENAME+" U"+
" ON UC."+UserChats.Properties.userId.columnName+"=U."UserDao.Properties.id.columnName+
" WHERE U."UserDao.Properties.isFriend.columnName+"=?"+
" AND T."+ChatDao.Properties.type.columnName+"=?", 1, myType);
Or (probably less performant):
Query<Chat> qc = chatDao.queryRawCreate(
" , "+UserChatsDao.TABLENAME+" UC"+
" , "+UserDao.TABLENAME+" U"+
" WHERE T."+ChatDao.Properties.type.columnName+"=?"+
" AND U."+UserDao.Properties.isFriend.columnName+"=?"+
" AND T."+ChatDao.Properties.id.columnName+"=UC."+UserChats.Properties.chatId.columnName+
" AND U."UserDao.Properties.id.columnName+"=UC."+UserChats.Properties.userId.columnName, myType, 1);
Then you can use the desired list()
-methods:
qc.list();
qc.listLazy();
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With