用jOOQ突变数据

时间:2018-12-07 17:34:09

标签: java jooq

也许我在滥用jOOQ,因为我正努力在其他地方找到该用例的解决方案。

我想将自己的方法应用于jOOQ查询中的某些行,如下所示:

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

hash(EMAIL)将返回电子邮件的哈希版本。

很明显,这种语法是无效的,但希望它能传达我的意图。

jOOQ是否支持这种功能?

1 个答案:

答案 0 :(得分:5)

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

hash()可能是您要使用的特定于供应商的哈希函数,但jOOQ并未通过DSL API提供它。在这种情况下,解决方案始终是求助于plain SQL templating

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);