esconderijo Por EclipseLink consulta só funciona quando eu uso query.getSingleResult ()?
-
21-08-2019 - |
Pergunta
A minha entidade tem uma consulta nomeada que tem esta aparência:
@NamedQuery(name = "Person.find", query = "select p from Organization p where p.name=:NAME")
No meu código eu quero definir a dica cache de consulta:
query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase");
Se eu tentar obter a lista de resultado inteiro:
List<Person> result = query.getResultList();
EclipseLink lança uma exceção:
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
Se eu tentar obter um único resultado, ele funciona:
Person person = query.getSingleResult();
Se eu remover a dica de consulta, em seguida, getResultList () funciona também.
Eu não entendo a exceção - não é dizendo que é especificamente esperando getResultList () ?? O que estou fazendo de errado?
Solução
documentação EclipseLink diz:
"EclipseLink não suporta o uso de cache para consultas nativas ou consultas que têm conjuntos de resultados complexos, tais como retorno de dados ou vários objetos."
Além disso, a documentação diz:
"CheckCacheThenDatabase -. Você pode configurar qualquer consulta leitura objeto para verificar o cache completamente antes de recorrer a acessar o banco de dados"
Assim, o comportamento parece ser ok, eu só encontrei a exceção enganosa.
EDIT: Tente algo assim na definição da entidade, que deve ser suficiente: (Codificado na página web assim não pode haver erros)
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)
}
})