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?
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 DSL
API. 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);