2016-11-09 3 views
2

나는 insert, updates 메소드를 작성 중이고 일반 인자를 메소드 매개 변수로 사용하려고합니다. 다음은 실론에서 지금까지 작성한 코드이며 잘 컴파일됩니다.JOOQ- 데이터베이스 작업 일반화 방법

메서드 호출의 일부로 필드와 값을 전달하고 싶습니다. 나는로 JOOQ에 의해 생성 된 클래스했습니다 :

public class TblGuest extends TableImpl<TblGuestRecord> { 
    public final TableField<TblGuestRecord, Integer> id .... 
    public final TableField<TblGuestRecord, String> guestName... 
} 

는 필드 TableField 다른 일반 매개 변수가 있음을 알 수있는 바와 같이, 나는 HashSet의에서 이러한 매개 변수를 추가 할 수있는 방법이 있는지 알고 싶습니다을 .. Set<TableField<GuestRecord,Object>> fields = HashSet<TableField<GuestRecord,Object>>();

TableField<GuestRecord,Object>을 제외한 TableField<GuestRecord,????>을 추가하면 물론 컴파일 예외가 발생합니다. 그러나 이것을 달성 할 수있는 방법이 있습니까?

답변

0

집합의 일반 매개 변수를 Set<TableField<R&Record, Object>|TableField<R&Record, JString>|TableField<R&Record, JInteger>> fields으로 변경하여이 작업을 수행 할 수있었습니다. 그리고 호출자에서 동일한 제네릭 형식을 사용하여 HashSet을 만듭니다. 즉, JOOQ를 사용하여 일반적인 인수로 삽입/업데이트 메소드를 작성하려면 JOOQ 테이블 클래스에서 생성 된 고유 한 필드 유형으로 모든 유형 인수를 매개 변수화해야합니다. 그러나, 최선의 방법/그것을 할 올바른 방법입니까?

1

많은 일반 매개 변수 유형을 사용하는 대신 와일드 카드를 사용하는 것이 더 적절합니다.

shared void insert<R>(DSLContext ctx, Table<R&Record> table, Set<TableField<R&Record, out Object>> fields, Set<Object> values){ 
      ctx.insertInto(table).columns(fields).values(values).execute();  
} 


shared void update<R>(DSLContext ctx, Table<R&Record> table, JMap<TableField<R&Record, out Object>, Object> map){ 
    ctx.update(table).set(map).execute(); 
} 

을 그리고 발신자는 HashSet의/HashMap의 인스턴스 수 있습니다 : 다음 코드는 예상대로 작동 나는이 사용하는 사이트 분산을 사용하는 매우 합리적인 경우처럼 보이는 것에 동의

JMap<TableField<GuestRecord, out Object>, Object> map = JHashMap<TableField<GuestRecord, out Object>, Object>(); 

Set<TableField<GuestRecord,out Object>> fields = HashSet<TableField<GuestRecord, out Object>>(); 
+0

합니다. –