1

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

@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() 吗?我究竟做错了什么?

4

1 回答 1

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)
  }
})
于 2009-03-23T11:01:10.097 回答