我的实体有一个命名查询,如下所示:
@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()?我做错了什么?
答案 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)
}
})