#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 🙂