La mutación de datos con jOOQ

Mateo Fitch:

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?

Lukas Eder:

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=234439&siteId=1
Recomendado
Clasificación