Tal vez estoy haciendo mal uso jOOQ, como yo estoy luchando para encontrar una solución a otra parte para este caso de uso.
Quiero aplicar mi propio método para algunas filas de una consulta jOOQ, a lo largo de las líneas de:
create
.update(USER)
.set(USER.EMAIL, hash(EMAIL))
.where(USER.ID.in(userIdsToUpdate))
.execute();
Donde hash(EMAIL)
volvería una versión hash del correo electrónico.
Obviamente, esta sintaxis no es válida, pero es de esperar que transmite mi intención.
¿Hay soporte para algo como esto con jOOQ?
En caso de que hash()
es una función específica del proveedor de SQL
hash()
es probablemente una función específica del proveedor hash que le gustaría usar, pero jOOQ no lo ofrece a través de la DSL
API. La solución en este caso es siempre recurrir a plantillas de SQL sin formato
public static Field<String> hash(Field<String> field) {
return DSL.field("hash({0})", SQLDataType.VARCHAR, field);
}
Como alternativa, puede rodar su propia utilizando la sintaxis de procedimiento almacenado de la base de datos y dejar que el generador de código de recogerlo para usted
En caso de que hash()
es un método Java
No se puede dejar que la base de datos llamar a su método Java desde dentro de una consulta SQL. Si desea hash de todos los correos electrónicos de su mesa, que tendría que obtener todos los registros, modificar los mensajes de correo electrónico, y almacenarlos de nuevo. Recomiendo hacerlo en la base de datos en su lugar ya que sería mucho más rápido, pero si eso no es una opción, así es como usted lo haría con 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);