次のようなコードがあります。
Record record = jooq
.selectCount()
.from(USERS)
.fetchOne();
現在、カウントを取得するために次のことを行っています。
Integer count = (Integer) record.getValue(0);
しかし、より良い解決策が必要なようです(それはタイプセーフです...それがjooqを使用することの全体的なポイントであるため)。助言がありますか?
残念ながら、この特定のクエリでは、値をタイプセーフに取得するための「より良い」方法は多くありません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);