esconderijo Por EclipseLink consulta só funciona quando eu uso query.getSingleResult ()?

StackOverflow https://stackoverflow.com/questions/672754

  •  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?

Foi útil?

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)
  }
})
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top