jOOQでデータを突然変異

マシュー・フィッチ:

私はこのユースケースのためのソリューションの他の場所を見つけるのに苦労してるようおそらく、私は、jOOQを悪用しています。

私はの線に沿って、jOOQクエリ内の一部の行に自分の方法を適用します:

create
    .update(USER)
    .set(USER.EMAIL, hash(EMAIL))
    .where(USER.ID.in(userIdsToUpdate))
    .execute();

どこでhash(EMAIL)メールのハッシュされたバージョンを返します。

明らかに、この構文は無効ですが、うまくいけば、それは私の意図を伝えます。

jOOQと、このようなもののためのサポートはありますか?

ルーカス・エダー:

場合にはhash()、ベンダー固有のSQL関数です

hash()おそらく、あなたが使用したいというベンダー固有のハッシュ関数であるが、jOOQはを通してそれを提供しないDSLAPI。この場合の解決策は、に頼ることは常にあるプレーンな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);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=234436&siteId=1