6

我在我的应用程序中有一个这样设计的关系: 关系描述 我正在尝试选择所有至少有一个用户作为朋友的聊天。

基本上,我想执行这个查询:

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

我还没有设法在 GreenDao 库中找到执行此操作的方法,并希望有人能够帮助我解决这个问题。

编辑:
这是我现在所拥有的:

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

1 回答 1

2

由于 grrendao 目前没有实现QueryBuilder.join()-methods,我认为您的解决方案是您现在可以获得的最好的解决方案之一,因为它在内部使用连接。

它只有很小的缺点:

  • 您可能会查询比实际需要更多的表
  • 你必须遍历一个可能很大的列表
  • 你不能使用listLazy()

另一种方法是使用这样的查询(假定IsFriend是一个int-column并且myType适合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);

或者(可能性能较差):

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

然后您可以使用所需的list()-methods:

qc.list();
qc.listLazy();
...
于 2013-11-04T09:44:27.410 回答