Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GreenDao deep queries with n:m relationships

I have in my application a relationship that is designed like this: relationship description 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());
    }
}
like image 410
thepoosh Avatar asked Nov 04 '13 07:11

thepoosh


1 Answers

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:

  • you potentially query more tables than you actually need
  • you have to iterate through a potentially large list
  • you cannot use 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();
...
like image 61
AlexS Avatar answered Oct 13 '22 19:10

AlexS