JPA 只创建一次查询

JPA create query only once

首先,抱歉,如果我问的是显而易见的问题,或者这个问题本质上是愚蠢的。

更多的学术问题需要知道我是否可以创建一个跨 EntityManager 或独立于 EntityManager 的 JPA 查询(命名或其他)。基本上,准备一次运行总是。我知道我们只能从实体管理器对象的 createXXXQuery 方法中获取一个 Query 实例,但是还有其他方法吗?

这就是我想要做的,

public class MyRepo {
 @PersistenceContext
 private EntityManager em;

 private Query aQueryIntentedtoBePreparedOnlyOnce;

 @PostConstruct
 public void prepareMyQuery(){
  aQueryIntentedtoBePreparedOnlyOnce = em.createQuery("...."); // Query with positional params
   }

  public void executeMyQuery(){
   aQueryIntentedtoBePreparedOnlyOnce.getResultList();
  }
 }

这是第一次完美执行。但是,它第二次说 "Entity Manager Closed." 我明白这是因为 EM 是事务范围的。

这个 EM 是容器管理的(JTA - Spring),所以我不能跨事务扩展它。而且,使用会话 bean 不是一种选择。那么,有没有办法只创建一次此查询?

PS : 命名查询和查询缓存从何而来?对于命名查询,我似乎仍然每次都做 createNamedQuery。什么是查询缓存计划,有什么好的文档吗?

还有一个问题,为什么只在 EM 或 Connection(JDBC) 上创建查询?为了准备查询,我不需要知道我正在与哪个数据库通话吗?就是这样一个人永远不会在没有适当连接的情况下执行一个?

每个查询对象都绑定到一个特定的 EntityManager,不能在另一个中重复使用,就像每个 EntityManager 都绑定到一个 JDBC 连接一样。

命名查询是一种缓存已编译查询和有关它们的有用元数据的方法。通常,当您使用 em.createQuery 时,它每次都会解析它。它可能会在缓存中保留一些关于它的信息,因为它很可能再次遇到相同的查询,但这不是必需的。

通过调用 createStatement(返回 Statement)、prepareStatement(返回继承前一个的 PreparedStatement)或 prepareCall 创建查询(在 JDBC 连接上返回继承前两个的 CallableStatement。这些 Statement 对象没有切换到另一个连接的接口。根据驱动程序的不同,它们可能缓存在 Java 应用程序或服务器上。语句可以在同一连接上重复使用任意多次,但不能在其他连接上重复使用。