也许我在滥用jOOQ,因为我正努力在其他地方找到该用例的解决方案。
我想将自己的方法应用于jOOQ查询中的某些行,如下所示:
create
.update(USER)
.set(USER.EMAIL, hash(EMAIL))
.where(USER.ID.in(userIdsToUpdate))
.execute();
hash(EMAIL)
将返回电子邮件的哈希版本。
很明显,这种语法是无效的,但希望它能传达我的意图。
jOOQ是否支持这种功能?
答案 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);