2017-07-28 1 views
0

私はJooqでページ分割をしています。データは複数のフィールドで並べ替えられ、そのうちの1つはフィールド上のカスタム関数です。例えば、私はこのようなするSortFieldている:最終SQLは次のようにJooq:SortFieldからの値の抽出

DSL.coalesce(TABLE.COLUMN, 0).asc() 

になります:

SELECT a, b, c 
FROM TABLE 
WHERE condition 
ORDER BY COLUMN_A ASC, coalesce(TABLE.COLUMN, 0) ASC 

今私は、ページ上の最後のレコードの値を取得したいです。

record.getValue(field.getName()) 

を使用するとき、それは通常のフィールドで動作します。しかし、それは私のカスタムフィールドに来るとき、それは

がjava.lang.IllegalArgumentExceptionがいるという例外がスローされます。フィールド(合体) が含まれていないが行内

の値を得る方法はありますか?は機能しますか?

答えて

1

これはjOOQに固有の問題ではありません。 SQLは単にこのように動作します。 ab、およびc

SELECT a, b, c 
FROM TABLE 
WHERE condition 
ORDER BY COLUMN_A ASC, coalesce(TABLE.COLUMN, 0) ASC 

は3列が生成されます:あなたは、その式を選択しなかったので、あなたが得た動作が自然です。例:

a b c 
------------ 
1 2 3 
4 5 6 

この結果、「coalesce」という名前の列はありません。名前が "合体"または類似の名前で列を持たせたい場合は、それを投影する必要があります。 jOOQ内:

Field<Integer> coalesce = DSL.coalesce(TABLE.COLUMN, 0); 

for (Record record : DSL.using(configuration) 
     .select(TABLE.A, TABLE.B, TABLE.C, coalesce) 
     .from(TABLE) 
     .where(condition) 
     .orderBy(TABLE.A.asc(), coalesce.asc())) 
    System.out.println(record.get(coalesce));