2016-11-09 51 views
2

我在写插入,更新方法并尝试使用泛型参数作为方法参数。以下是我迄今为止在Ceylon编写的代码,它编译良好。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(); 
} 

我想通过字段和值作为方法调用的一部分。我已经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

我同意这看起来像使用使用现场方差一个非常合理的情况。 –