为什么EclipseLink查询缓存仅在我使用query.getSingleResult()时有效?

时间:2009-03-23 09:52:07

标签: java jpa eclipselink

我的实体有一个命名查询,如下所示:

@NamedQuery(name = "Person.find", query = "select p from Organization p where p.name=:NAME")

在我的代码中,我想设置查询缓存提示:

query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase");

如果我试图获得整个结果列表:

List<Person> result = query.getResultList();

EclipseLink抛出异常:

Exception [EclipseLink-6124] (Eclipse Persistence Services - 1.0.1 (Build 20080905)): org.eclipse.persistence.exceptions.QueryException
Exception Description: Required query of class org.eclipse.persistence.queries.ReadAllQuery, found class org.eclipse.persistence.queries.ReadObjectQuery

如果我尝试只得到一个结果,它就可以了:

Person person = query.getSingleResult();

如果我删除了查询提示,那么getResultList()也可以工作。

我不明白异常 - 是不是说它特意期待getResultList()?我做错了什么?

1 个答案:

答案 0 :(得分:2)

EclipseLink文档说:

“EclipseLink不支持具有复杂结果集的本机查询或查询的缓存使用,例如返回数据或多个对象。”

文档也说:

“CheckCacheThenDatabase - 您可以配置任何读取对象查询以在访问数据库之前完全检查缓存。”

所以行为似乎没问题,我只是发现了例外误导。

编辑:在实体定义中尝试这样的东西,这应该足够了:(在网页上编码,这样可能会有错误)

Entity
@Cache(expiry = 3600000, // 1 hour size = 10000)
@NamedQueries({
  @NamedQuery(name = "Person.findByPK", query = "select p from Person p " +
  "where p.name=:NAME",
  hints = {
    @QueryHint(name = QueryHints.CACHE_USAGE,
    value = CacheUsage.CheckCacheThenDatabase),
    @QueryHint(name = QueryHints.QUERY_TYPE, value = QueryType.ReadObject)
  }
})