Мутация данных с помощью jOOQ - PullRequest
0 голосов
/ 07 декабря 2018

Возможно, я неправильно использую jOOQ, так как изо всех сил пытаюсь найти решение в другом месте для этого варианта использования.

Я хочу применить свой собственный метод к некоторым строкам в запросе jOOQ вдоль строк:

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

Где hash(EMAIL) вернет хешированную версию письма.

Очевидно, этот синтаксис недействителен, но, надеюсь, он передает мои намерения.

Есть липоддержка всего этого с jOOQ?

1 Ответ

0 голосов
/ 10 декабря 2018

В случае, если hash() является специфичной для поставщика функцией SQL

hash(), вероятно, является специфичной для поставщика хэш-функцией, которую вы хотели бы использовать, но jOOQ не предлагает ее через DSL API.Решением в этом случае всегда является использование простого SQL-шаблона

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

В качестве альтернативы, вы можете свернуть свой собственный, используя синтаксис хранимой процедуры вашей базы данных, и позволить генератору кода подобрать его дляyou

В случае, если hash() является методом Java

Вы не можете позволить базе данных вызывать ваш метод Java из запроса SQL.Если вы хотите хэшировать все электронные письма со своей таблицы, вам нужно будет извлечь все записи, изменить электронные письма и сохранить их снова.Вместо этого я рекомендую делать это в базе данных, так как это будет намного быстрее, но если это не вариант, вот как бы вы сделали это с 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);
...