7

次のようなコードがあります。

Record record = jooq
    .selectCount()
    .from(USERS)
    .fetchOne();

現在、カウントを取得するために次のことを行っています。

Integer count = (Integer) record.getValue(0);

しかし、より良い解決策が必要なようです(それはタイプセーフです...それがjooqを使用することの全体的なポイントであるため)。助言がありますか?

4

1 に答える 1

7

残念ながら、この特定のクエリでは、値をタイプセーフに取得するための「より良い」方法は多くありませんcount()。型安全性を追加するためにできることは、次のとおりです。

Field<Integer> f = count();
Integer count = jooq.
    .select(f) // Or selectCount(). Replaced it to illustrate the case
    .from(USERS)
    .fetchOne(f);

fetch()問題は、メソッドが「到達」するまでに、プロジェクションに関するほとんどの型情報がJavaコンパイラに「失われた」ことです。メソッドが句ResultQuery.fetchXXX()からそれを回復し、それをあなたに生成する方法はありません。SELECT

jOOQユーザーグループでは、一部のユーザーは、fetch()C#のLINQまたはScalaのSLICKが行う方法とまったく同じように、プロジェクションをメソッドに移行することを主張しています。SELECTこれは、より高度なステートメントの表現を非常に複雑にします。より詳細な説明はここに文書化されています

jOOQ 3.0では、追加のレコードレベルの型安全性が導入されました。したがって、jOOQ 3.3では、単一の値をそのままフェッチすることが可能になります(#2246として登録されています)。

<T> T fetchValue(Select<Record1<T>> select);
于 2013-02-19T09:03:33.683 に答える