Hibernate 每次执行SELECT语句时,JPA是否可以缓存查询?

Hibernate 每次执行SELECT语句时,JPA是否可以缓存查询?,hibernate,jpa,Hibernate,Jpa,例如,我有以下查询(JPA的实现是Hibernate): 我知道JPA会在我第一次执行这个查询时将其解释为SQL,但是如果第二次执行呢?JPA会再解释一遍吗?这是一个耗时的过程 如果我将所有这些查询更改为NamedQuery,是否会有显著的性能改进?是的,查询计划会被缓存 这就是流程: em.createQuery(…) org.hibernate.internal.SessionImpl.createQuery(字符串查询字符串) org.hibernate.internal.Abstract

例如,我有以下查询(JPA的实现是Hibernate):

我知道JPA会在我第一次执行这个查询时将其解释为SQL,但是如果第二次执行呢?JPA会再解释一遍吗?这是一个耗时的过程


如果我将所有这些查询更改为
NamedQuery
,是否会有显著的性能改进?

是的,查询计划会被缓存

这就是流程:

  • em.createQuery(…)
  • org.hibernate.internal.SessionImpl.createQuery(字符串查询字符串)
  • org.hibernate.internal.AbstractSessionImpl.createQuery(字符串查询字符串)
  • org.hibernate.internal.SessionFactoryImpl.getQueryPlanCache().getHQLQueryPlan(查询,…)
    因此,查询缓存在会话工厂中,因此一旦查询被翻译,它将在未来的所有会话中共享。

    请参阅@AntonBessonov是的,我看过这篇文章。但答案有些矛盾。
    return em.createQuery("select m.username from Member m", String.class)
            .getResultList();