マシュー・フィッチ:
私はこのユースケースのためのソリューションの他の場所を見つけるのに苦労してるようおそらく、私は、jOOQを悪用しています。
私はの線に沿って、jOOQクエリ内の一部の行に自分の方法を適用します:
create
.update(USER)
.set(USER.EMAIL, hash(EMAIL))
.where(USER.ID.in(userIdsToUpdate))
.execute();
どこでhash(EMAIL)
メールのハッシュされたバージョンを返します。
明らかに、この構文は無効ですが、うまくいけば、それは私の意図を伝えます。
jOOQと、このようなもののためのサポートはありますか?
ルーカス・エダー:
場合には
場合は
場合にはhash()
、ベンダー固有のSQL関数です
hash()
おそらく、あなたが使用したいというベンダー固有のハッシュ関数であるが、jOOQはを通してそれを提供しないDSL
API。この場合の解決策は、に頼ることは常にあるプレーンなSQLのテンプレート
public static Field<String> hash(Field<String> field) {
return DSL.field("hash({0})", SQLDataType.VARCHAR, field);
}
また、あなたは、データベースのストアドプロシージャの構文を使用して、独自のロールとコードジェネレータは、あなたのためにそれを拾うことができましょう
場合はhash()
、Javaメソッドであります
あなたは、データベースがSQLクエリ内からJavaメソッドを呼ぶことはできません。あなたがあなたのテーブルからすべての電子メールをハッシュしたい場合は、すべてのレコードをフェッチするメールを変更し、再度、それらを格納する必要があると思います。私はそれがはるかに高速になるよう代わりにデータベースにそれをやってお勧めしますが、それはオプションではない場合、ここにあなたがjOOQでそれを行うだろう方法は次のとおりです。
Result<UserRecord> users = create
.select(USER.ID, USER.EMAIL)
.from(USER)
.where(USER.ID.in(userIdsToUpdate))
.fetchInto(USER);
for (UserRecord user : users)
user.setEmail(hash(user.getEmail()));
create.batchUpdate(users);