2013-11-04 1 views
6

내 응용 프로그램에 다음과 같이 설계된 관계가 있습니다. relationship description 적어도 하나의 사용자가 친구로있는 모든 채팅을 선택하려고합니다. 나는 GreenDao 라이브러리에서이를 실행할 수있는 방법을 찾기 위해 관리하지 않은 사람이 나를 도울 수있을 것입니다 기대했다GreenDao deeply queries with n : m relationships

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 

:

는 기본적으로,이 쿼리를 실행합니다.

편집 :
이것은 내가가 가지고있는 지금에 : grrendao 순간에 QueryBuilder.join() -methods를 구현하지 않기 때문에

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

답변

2

, 당신의 솔루션은 최고 중 하나라고 생각하면 내부적으로 조인을 사용하기 때문에 지금 당장 얻을 수 있습니다.

그것에 사소한 단점이 있습니다

  • 잠재적으로 쿼리 할 위험이 큰 목록을 반복해야 당신이 실제로
  • 을 필요 이상 테이블이
  • 는 사용할 수 없습니다 listLazy()

또 다른 방법은 이와 같은 쿼리를 사용하는 것입니다 (IsFriendint-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); 

또는 :

내가 생각
qc.list(); 
qc.listLazy(); 
... 
+0

'T'가 이미 촬영되어 다음

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을 사용할 수 있습니다 'QueryBuilder' – thepoosh

+0

맞습니다. 그리고 그것을 사용하는 것이 목적입니다. 'queryRawCreate()'는'SELECT T. * From YourTable T'와 같은 질의를 생성합니다. 따라서'FROM' 절을 확장하고'where' 절을 추가 할 수 있습니다. – AlexS

+0

오, 오케이 ... 나는 그것을 시도하고 실패했다. 곧 다시 시도 할 것입니다 – thepoosh