2016-11-09 5 views
2

私はinsert、updatesメソッドを記述しており、汎用引数をメソッドパラメータとして使用しようとしています。以下は私が今までにセイロンで書いたコードであり、よくコンパイルされています。JOOQ - データベース操作を一般化する方法

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

メソッド呼び出しの一部としてフィールドと値を渡したいと思います。それはフィールドがTableFieldに異なる一般的なパラメータを持っていることは明らかであるように、私はHashSetの中で、これらのパラメータを追加する方法があるかどうかを知りたい

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

..:私はとJOOQによって生成されたクラスをしましたSet<TableField<GuestRecord,Object>> fields = HashSet<TableField<GuestRecord,Object>>();

TableField<GuestRecord,Object>を除いてTableField<GuestRecord,????>を追加すると、もちろんコンパイル例外が発生します。しかし、これを達成する方法はありますか?

答えて

0

私は、Generic params of SetをSet<TableField<R&Record, Object>|TableField<R&Record, JString>|TableField<R&Record, JInteger>> fieldsに変更することでそれを達成できました。また、呼び出し側で同じジェネリック型のHashSetを作成します。つまり、JOOQを使用して汎用引数を持つ挿入/更新メソッドを作成するには、JOOQテーブルクラスで作成された一意のフィールドタイプを使用して、すべての型引数をパラメータ化する必要があります。しかし、それを行うには最良の方法/正しい方法ですか?

1

多くのGeneric Paramタイプを配置するのではなく、ワイルドカードを使用する方が適切です。

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

。 –

関連する問題