Как повторно использовать (собственный) запрос JPA весной с помощью container managed EntityManager

#java #sql #spring #hibernate #jpa

#java #sql #spring #переход в спящий режим #jpa

Вопрос:

Я использую Spring JPA (спящий режим) и выполняю собственные запросы SQL. Запрос встроен в код, но всегда один и тот же, поэтому может быть использован повторно.

Я хочу повторно использовать его так же, как старое JDBC PreparedStatement, в надежде, что это даст мне некоторое волшебное улучшение производительности, потому что база данных может повторно использовать план выполнения или что-то в этом роде.

Итак, мой компонент service выглядит примерно так:

 @Service
public class TeaService {

    @Autowired String todaysSecret;

    @PersistenceContext
    private EntityManager entityManager;

    public void makeTea(final String teaType) {
       final String querySql = "select tea from table"   todaysSecret   " where type = :teaType";
       entityManager.createNativeQuery(querySql).setParameter("teaType", teaType).executeUpdate();
    }
}
  

И я хочу что-то вроде:

 @Service
public class TeaService {

    @Autowired String todaysSecret;

    @PersistenceContext
    private EntityManager entityManager;

    private Query reusableQuery;

    @PostConstruct
    private void postConstruct() {
       final String querySql = "select tea from table"   todaysSecret   " where type = :teaType";
       reusableQuery = entityManager.createNativeQuery(querySql);
    }

    public void makeTea(final String teaType) {
       reusableQuery.setParameter("teaType", teaType).executeUpdate();
    }
}
  

Который может «работать», но, насколько я понимаю, экземпляры запроса не должны жить дольше, чем EntityManager, который их создал, а управляемый контейнером EntityManager, введенный с использованием @PersistenceContext, на самом деле является прокси, где контейнер может обновлять фактический EntityManager.

Итак, каким был бы правильный способ сделать это? Возможно ли это вообще? Есть ли какое-либо место в текущем «контексте сохранения», где я могу сохранить запрос? Нужен ли мне другой сервис / компонент / что-то для управления этими повторно используемыми запросами? @NamedNativeQuery вроде как делает то, что я хочу, но допускает только одну статическую строку, мой запрос довольно статичен, но его нужно создавать программно (один раз). Могу ли я как-то использовать ту же систему / хранилище, что и эти именованные запросы?

Надеюсь, что есть кто-то, кто действительно знает и понимает этот материал 🙂

Спасибо!

Комментарии:

1. Вы имеете в виду что-то вроде этого ?

2. Это очень похоже на то, что я хочу 🙂 Я проверю, действительно ли мой env соответствует JPA 2.1 🙂