使用jOOQ变换数据

Mat*_*tch 2 java jooq

也许我在滥用jOOQ,因为我正努力在其他地方为这个用例找到解决方案.

我想将自己的方法应用于jOOQ查询中的某些行,类似于:

create
    .update(USER)
    .set(USER.EMAIL, hash(EMAIL))
    .where(USER.ID.in(userIdsToUpdate))
    .execute();
Run Code Online (Sandbox Code Playgroud)

哪里hash(EMAIL)会返回电子邮件的哈希版本.

显然这种语法无效,但希望它传达了我的意图.

用jOOQ支持这样的东西吗?

Luk*_*der 5

如果hash()是供应商特定的SQL函数

hash()可能是您想要使用的特定于供应商的哈希函数,但是jOOQ不通过DSLAPI 提供它.在这种情况下,解决方案总是采用纯SQL模板

public static Field<String> hash(Field<String> field) {
    return DSL.field("hash({0})", SQLDataType.VARCHAR, field);
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用数据库的存储过程语法自行滚动并让代码生成器为您选择它

如果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);
Run Code Online (Sandbox Code Playgroud)