我的项目是 Spring-boot + Spring-data-jpa + hibernate + ehcache。二级缓存适用于以下内容:
- 扩展 JpaRepository
2a。它与我的 HQL 查询一起使用 query.setHimt("org.hibernate.cacheable", true);
它不起作用,如果
- 我用其他类包装结果,例如 Page<>
2b。如果我使用规范和标准来查询而不是 HQL
我的设置对于 2a 和 2b 都是一样的。假设我的实体类是 City。我像这样使用规范:
CriteriaBuilder build = em.getCriteriaBuilder();
CriteriaQuery<City> query = build.createQuery(City.class);
Root<city> root = query.from(City.class);
query.where(spec.toPredicate(root,query,build));
TypedQuery<City> tq = em.createQuery(query);
tq.setHint("org.hibernate.cacheable", true);
return tq.getResultList();
结果集是正确的,对象列表与 HQL 相同。但是如果我在循环中调用这个方法,它每次都会从数据库中检索。
我不明白,HQL 和规范都会生成 TypedQuery<>。我可以使用 Hibernate 和 ehcache 缓存规范查询吗?