2016-07-06 2 views
6

에 두 개의 테이블을 조인 가져올 수 있습니다 두 테이블간에 조인을하고 싶습니다. USERROLE,이 두 테이블에 대한 POJO 결과를 어떻게 가져올 수 있습니까? ,jOOQ은 내가 예를 들어, 자동 생성 jOOQ에 내가 POJO를을 테이블의 행을 인출하려는 경우가 jOOQ에서 각각의 POJO를

+0

방법 사용자 및 역할이 연결되어 있습니까? 일대 다? 다 대일? 다 대다? –

+0

many-to-many, 예, 테이블이 있습니다. UserToRole –

답변

12

이는 대신 LEFT JOIN을 사용하려는 경우, ResultQuery.fetchGroups(RecordMapper, RecordMapper)

Map<UserPojo, List<RolePojo>> result = 
dsl.select(USER.fields()) 
    .select(ROLE.fields()) 
    .from(USER) 
    .join(USER_TO_ROLE).on(USER.USER_ID.eq(USER_TO_ROLE.USER_ID)) 
    .join(ROLE).on(ROLE.ROLE_ID.eq(USER_TO_ROLE.ROLE_ID)) 
    .where(USER.U_EMAIL.equal(email)) 
    .fetchGroups(

     // Map records first into the USER table and then into the key POJO type 
     r -> r.into(USER).into(UserPojo.class), 

     // Map records first into the ROLE table and then into the value POJO type 
     r -> r.into(ROLE).into(RolePojo.class) 
    ); 

주를 사용하여 하나 개의 솔루션입니다 (사용자가 반드시 어떤 역할이없는 경우에, 당신은 사용자 당 빈 목록을 얻으려면) NULL 역할을 자신의 빈 목록으로 변환해야합니다.

당신이 HashMap 같은 키에 넣어 수 있도록 여러분의 POJO들에 equals()hashCode()를 생성 활성화했는지 확인하십시오 :

<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode> 
+0

답해 주셔서 감사합니다. 그러나 이것이 fetchLazy와 어떻게 조합 될 수 있는지 궁금해졌습니다. –

+0

@Kango_V : 좋은 지적. 이 두 기능은 현재 결합 할 수 없습니다. 이 기능 요청을 만들었습니다 : https://github.com/jOOQ/jOOQ/issues/6046. 물론'Cursor' ('fetchLazy()'에서)를 Java 8'Stream'으로 변환 한 다음'collect()'를 사용하여 결과를 그룹화 할 수 있습니다 ... –

+0

일대 다 관계 선박? Feature 테이블과 Tier 테이블이 있으며, 1 티어는 여러 기능을 가질 수 있습니다. Map > 바이트가 tierID 및 기능 이름 목록에 해당하므로 쿼리하고 결과를 얻으려고합니다. – user160108

관련 문제