2016-12-02 12 views
2

私はjooq apiを使って次のようなクエリを構築しようとしています。jooqクエリをオフセットに組み込むことはできますか?

select(x.fields()).from(x) 
    .offset(param(greatest(val(0), select(count().sub(1)).from(x).field(0, Integer.class)))) 

によって

select x.* 
from x 
offset greatest(0, (select count(*) - 1 from x)); 

私は私が間違ってoffset(Param<Integer>)メソッドを使用していますかなり確信しています。オフセットのためにnullがレンダリングされているようです。 jooqが行うことができるこのようなオフセットを構築していますか? (offsetの方法は、jooq APIの残りの部分と比較して、できることに少し制限があるようです。)

文脈なしのこのクエリは、私がやってみたいことです)

ありがとう!

+0

質問は次のとおりです。データベースで実行できますか? (あなたのデータベースは何ですか?) –

+1

ポストグラムでやることができます。私は実際にCTEを使ってそれをやっていますが、それはCTEに限られていません。 – dsmith

答えて

1

私は、任意のデータベースは、あなたが(それ はPostgreSQLの可能で、dsmithのコメントを参照)、その OFFSETLIMIT条項 に非定数式を置くことを可能にするとは思いません。いずれにしても、jOOQはあなたにそれを許可しません。定数intの値またはバインド変数(Param)のいずれかを指定する必要があります。

しかし、あなたのケースでは、とにかくその機能は必要ありません。あなたの仮想的な構文...

select x.* 
from x 
offset greatest(0, (select count(*) - 1 from x)); 

がこれに相当します:すべての後に

select x.* 
from x 
order by <implicit ordering> desc 
limit 1; 

、クエリは、(いくつかの暗黙の順序で)最後の行を探しているようだ、なぜありませんそれを明示するだけですか?

+0

上記で言及していますが、これは正当なpostgresの構文です。テーブルを取得するまでに、元の注文フィールドは存在しません(注文を元に戻すことはできません)。私の望む結果を出すために、より高いレベルで私のクエリを書き直さなければならないでしょう。 とにかく、jooqがこのようなクエリ構築を許可していないことを確認するだけです。ありがとう。 – dsmith

+0

@dsmith:ああ、ポインタありがとう。私はこれを知らなかった。私はこのための機能要求を作成しました:https://github.com/jOOQ/jOOQ/issues/5695。もちろん、生成されたSQL文字列を傍受し、あなた自身の 'OFFSET'式をパッチすることで、jOOQの制限を回避することができます。例えば。 'ExecuteListener'を使って –

関連する問題