2009-03-23 2 views
1

Моя сущность имеет именованный запрос, который выглядит следующим образом:Почему кеш Query EclipseLink работает только при использовании query.getSingleResult()?

@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() ?? Что я делаю не так?

ответ

2

EclipseLink документация говорит:

«EclipseLink не поддерживает использование кэша для родных запросов или запросов, которые имеют сложные наборы результатов, такие как возврат данных или несколько объектов.»

Также документация говорит:

«CheckCacheThenDatabase - Вы можете настроить любой запрос для чтения объекта для проверки кэша полностью, прежде чем прибегать к доступу к базе данных.»

Таким образом, поведение, похоже, в порядке, я просто нашел исключение в заблуждении.

EDIT: Попробуйте что-нибудь подобное в определении сущности, это должно быть достаточно: (Кодовый на веб-странице, так что могут быть ошибки)

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) 
    } 
}) 
Смежные вопросы