2016-09-29 13 views
1

DB를 쿼리하는 데 JDBI를 사용하고 있습니다. 외래 키를 통해 연결된 두 테이블이 있고 내 쿼리가 두 테이블의 조인을 반환합니다. 반환 된 값을 객체로 변환하려면 내 객체에 ResultSetMapper을 구현했습니다. 쿼리의 ResultSet에는 두 테이블의 열이 모두 포함됩니다 : t1.id, t1.name, t2.id, t2.name. 어떻게 테이블 이름에 따라 분할 할 수 있습니까? 이 코드를 찾고 있어요 :테이블별로 ResultSet에서 열을 제거하십시오.

public class T1Object { 
    private long id; 
    private String name; 
    private T2Object t2Object; 
} 

public class T2Object { 
    private long id; 
    private String name; 
} 

public void map(ResultSet r) { 
    String t1Name = "Table1 name"; 
    String t2Name = "Table2 name"; 

    t1ResultSet = getResultSetByTableName(r, t1Name); // looking for this function's implementation 
    t2ResultSet = getResultSetByTableName(r, t2Name); 

    // convert each result set to an object using it's mapper... 
} 

문제는 같은 이름을 가진 일부 열이 Table1Table2 그래서 각 열에 대해 다른 이름을 반환하고 단지 전체 ResultSet을 구문 분석 쿼리를 변경 간주 한 것입니다 그러나 많은 열이 있거나 Table2 만 변경하면이 크기가 잘 조정되지 않습니다 (Table2에 대한 매퍼를 변경하는 것뿐만 아니라 여기로 돌아가서 변경해야한다는 것을 기억해야합니다).

이 부분은 solution이지만 지나치게 복잡해 보입니다.

어떤 생각이 매우 극명하게 될 것이다 .... 내가 선택 생성자 인수로 열 이름 접두사와 매퍼를 구현하는 것이 좋습니다

답변

0

: 당신이 가입이 필요한 상황이있을 때, 따라서

class T1Mapper implements ResultSetMapper<T1Object> { 
    public T1Mapper() { this(""); } 
    public T1Mapper(String prefix) { 
    this.prefix = prefix; 
    } 

    private final String prefix; 

    T1Object map(int i, ResultSet rs, StatementContext ctx) throws SQLException { 
    return new T1Object(rs.getInt(prefix + "id"), 
         rs.getString(prefix + "name")); 
    } 
} 

// ditto for t2 mapper 

조회에서 공통 라벨 열 이름 각 열이 여러 테이블을 명확하게하기 :

List<T1Object> handle.createQuery("select t1.id t1_id, t1.name t1_name, " + 
        "t2.id t2_id, t2.name t2_name " + 
        "from table1 t1 left join table2 t2 " + 
        "on t1.id = t2.t1_id") 
     .map(new ResultSetMapper<T1Object>() { 
     T1Mapper t1Mapper = new T1Mapper("t1_"); 
     T2Mapper t2Mapper = new T2Mapper("t2_"); 

     public T1Object map(int i, ResultSet rs, StatementContext ctx) { 
      T1Object t1 = t1Mapper.map(i, rs, ctx); 
      T2Object t2 = t2Mapper.map(i, rs, ctx); 
      t1.setT2Object(t2); 
      return t1; 
     } 
     }) 
     .list(); 

몇 가지 멋진 트릭이 아니라면 내가 들어 본적이 없다. 실제로 커브 이름 앞에 접두어를 붙이지 않아도된다. 직접 커스텀 조인 행 매퍼를 작성하고 싶지 않다면 말이다.

우리는이 사용 사례를 v3에서 훨씬 더 잘 처리했다고 생각합니다 (아직 알파 상태 임). BeanMapper과 같은 모든 반사 맵퍼는 위에서 설명한대로 열 이름 접두사를 즉시 지원합니다. 따라서

@SqlQuery("select t1.id t1_id, t1.name t1_name, " + 
      "t2.id t2_id, t2.name t2_name " + 
      "from table1 t1 left join table2 t2 " + 
      "on t1.id = t2.t1_id") 
@RegisterBeanMapper(value = {T1Object.class, T2Object.class}, 
        prefix = {"t1_", "t2_"}) 
@RegisterJoinRowMapper({T1Object.class, T2Object.class}) 
List<JoinRow> listJoins(); 

:

myDao.listJoins() 
    .stream() 
    .map(joinRow -> { 
     T1Object t1 = joinRow.get(T1Object.class); 
     T2Object t2 = joinRow.get(T2Object.class); 

     // merge the individual entities in your join rows however you like 
     t1.setT2(t2); 
     return t1; 
    }) 
    .collect(toList()); 
우리는이 바보 간단하게 JoinRowMapper 추가