Перепишите критерии гибернации с предложением IN, чтобы можно было повторно использовать один и тот же PreparedStatement с другим количеством предложений IN - PullRequest
0 голосов
/ 26 июня 2019

Я часто использую следующий запрос Hibernate при получении нескольких записей по их первичному ключу

       Criteria c = session
                .createCriteria(Song.class)
                .setLockMode(LockMode.NONE)
                .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
                .add(Restrictions.in("recNo", ids));
        List<Song> songs = c.list();

Проблема в том, что количество идентификаторов может варьироваться от 1 до 50, а для каждого различного числа идентификаторов требуется разное PreparedStatement. Это в сочетании с тем фактом, что какой-либо конкретный подготовленный оператор связан с конкретным подключением к пулу базы данных, означает, что возможность повторного использования PreparedStatement довольно мала.

Есть ли способ, которым я могу переписать это так, чтобы один и тот же оператор мог использоваться с разным числом значений, я думаю, что я где-то читал, что это можно сделать, используя ЛЮБОЙ, но не могу найти ссылку.

1 Ответ

1 голос
/ 26 июня 2019

Это называется "заполнением параметров предложения" и может быть активировано с помощью свойства гибернации:

<property
    name="hibernate.query.in_clause_parameter_padding"
    value="true"
</property>

Подробнее об этой теме здесь: https://vladmihalcea.com/improve-statement-caching-efficiency-in-clause-parameter-padding/

...