Mutação de dados com jOOQ

Matthew Fitch:

Talvez eu esteja fazendo mau uso jOOQ, como eu estou lutando para encontrar um outro lugar solução para este caso de uso.

Quero aplicar o meu próprio método para algumas linhas em uma consulta jOOQ, ao longo das linhas de:

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

Onde hash(EMAIL)iria retornar uma versão hash do e-mail.

Obviamente, esta sintaxe é inválido, mas espero que ele transmite a minha intenção.

Existe suporte para qualquer coisa como isto com jOOQ?

Lukas Eder:

No caso hash()é uma função fornecedor específico SQL

hash()é provavelmente uma função fornecedor específico hash que você gostaria de usar, mas não jOOQ não oferecê-lo através da DSLAPI. A solução neste caso é sempre de recorrer a modelagem SQL simples

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

Alternativamente, você pode rolar o seu próprio uso do seu banco de dados sintaxe procedimento armazenado e deixar o gerador de código buscá-lo para você

No caso hash()é um método Java

Você não pode deixar o banco de dados chamar seu método Java a partir de uma consulta SQL. Se você quiser botar todos os e-mails de sua mesa, você teria que buscar todos os registros, modificar os e-mails, e armazená-los novamente. Eu recomendo fazê-lo no banco de dados em vez, pois isso seria muito mais rápido, mas se isso não é uma opção, é aqui como você faria com 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);

Acho que você gosta

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