JPA:缓存查询
我正在使用JPA在基于Java EE的Web应用程序中加载和保存实体。Hibernate被用作JPA的实现,但我不使用Hibernate特定的功能,只使用纯JPA。
下面是一些DAO类,注意方法:getOrders
class OrderDao { EntityManager em; List getOrders(Long customerId) { Query q = em.createQuery( "SELECT o FROM Order o WHERE o.customerId = :customerId"); q.setParameter("customerId", customerId); return q.getResultList(); } }
方法很简单,但它有一个很大的缺点。每次调用该方法时,都会在 JPA 实现中的某个位置执行以下操作:
- JPQL 表达式被解析并编译为 SQL。
- 创建并初始化语句或预准备语句实例。
- 语句实例填充参数并执行。
我认为上述步骤 1 和 2 应该在每个应用程序生存期内实现一次。但是如何制作它呢?换句话说,我需要缓存查询实例。
当然,我可以在我这边实现这样的缓存。但是等等,我正在使用现代强大的ORM!他们不是已经为我做了这个吗?
请注意,我没有提到像Hibernate查询缓存这样的东西,它缓存查询的结果。在这里,我想更快地执行我的查询。