Почему EclipseLink Query работает только когда я использую query.getSingleResult ()? - PullRequest
1 голос
/ 23 марта 2009

У моего объекта есть именованный запрос, который выглядит следующим образом:

@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 Ответ

2 голосов
/ 23 марта 2009

Документация 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)
  }
})
...