2014-11-20 1 views
1

У меня есть код, который генерирует объект jOOQ Select, который мне нужно использовать как часть более сложного запроса.Типы столбцов в jOOQ subselect

Что-то вроде это работает:

Select<Record3<Long, Integer, BigDecimal>> s = getFromSomewhere(); 
Field<?>[] f = s.fields(); 

// use it in a sub-select 
Select<Record2<?,?>> x = DSL.select(f[0], f[1]).from(s); 

Но теперь я потерял всю информацию о типе.

Есть ли лучший способ?

+0

Тип строки кажется полезным, см. Http://stackoverflow.com/questions/19638337/keep-type-information-of-aliased-fields-in-jooq?rq=1, но я не знаю, как постройте строку из моего выбора. – Thilo

ответ

3

Что вы могли бы сделать в качестве обходного пути является создание следующих небезопасным, но гарантированно работать вспомогательный API:

public static <T1, T2, T3> Row3<T1, T2, T3> row3(Select<Record3<T1, T2, T3>> select) { 
    return (Row3) DSL.row(select.field(1), select.field(2), select.field(3)); 
} 

Или, если вы хотите принять ставки на внутренних jOOQ, это будет работать так же:

public static <T1, T2, T3> Row3<T1, T2, T3> row3(Select<Record3<T1, T2, T3>> select) { 
    (Row3<T1, T2, T3>) select.fieldsRow(); 
} 

суффикс 3 необходим, потому что без суффикса, вы не могли бы перегружать различные методы row принимая различные записи степени, из-за общего типа стирания.

Эта строка может затем быть действительно использован как таковой:

Select<Record3<Long, Integer, BigDecimal>> s = getFromSomewhere(); 
Row3<Long, Integer, BigDecimal> row = row3(s); 

// use it in a sub-select 
Select<Record2<Long, Integer>> x = DSL.select(row.field1(), row.field2()).from(s); 

Я также зарегистрировать это как функция запроса для jOOQ 3.6.0: #3796.