2009-03-23 3 views
1

Mon entité a une requête nommée qui ressemble à ceci:Pourquoi le cache de requête EclipseLink fonctionne uniquement lorsque j'utilise query.getSingleResult()?

@NamedQuery(name = "Person.find", query = "select p from Organization p where p.name=:NAME") 

Dans mon code, je veux définir l'indice de cache de requête:

query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase"); 

Si je tente d'obtenir la liste entière des résultats:

List<Person> result = query.getResultList(); 

EclipseLink lance une exception:

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 

Si j'essaie d'obtenir un seul résultat, il fonctionne:

Person person = query.getSingleResult(); 

Si je supprime l'indicateur de requête, puis getResultList() fonctionne également.

Je ne comprends pas l'exception - ne dit-on pas qu'il attend spécifiquement getResultList() ?? Qu'est-ce que je fais mal?

Répondre

2

documentation EclipseLink dit:

« EclipseLink ne supporte pas l'utilisation du cache pour les requêtes natives ou des requêtes qui ont des ensembles complexes de résultats tels que le retour des données ou plusieurs objets. »

également la documentation dit:

« CheckCacheThenDatabase - Vous pouvez configurer une requête objet en lecture pour vérifier le cache complètement avant de recourir à l'accès à la base de données. »

Donc, le comportement semble être correct, je viens de trouver l'exception trompeuse.

EDIT: Essayez quelque chose comme ceci dans la définition de l'entité, qui devrait être suffisant: (Codé sur la page Web afin qu'il peut y avoir des erreurs)

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) 
    } 
}) 
Questions connexes