views:

1399

answers:

3

My entity has a named query which looks like this:

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

In my code I want to set the query cache hint:

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

If I try to get whole result list:

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

EclipseLink throws an 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

If I try to get only a single result, it works:

Person person = query.getSingleResult();

If I remove the query hint, then getResultList() works also.

I don't understand the exception - isn't it saying that it is specifically expecting getResultList()?? What am I doing wrong?

+1  A: 

EclipseLink documentation says:

"EclipseLink does not support the cache usage for native queries or queries that have complex result sets such as returning data or multiple objects."

Also the documentation says:

"CheckCacheThenDatabase – You can configure any read-object query to check the cache completely before you resort to accessing the database."

So the behaviour seems to be ok, I just found the exception misleading.

EDIT: Try something like this in the entity definition, that should be enough: (Coded on the web page so there can be errors)

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)
  }
})
tputkonen
A: 

Hello tputkonen,

Did you find a way to get the Persons list without hittinh the database every time?

Regards, Steliyan

Yes, with EclipseLink that was very easy! Try something like this:Entity@Cache(expiry = 3600000, // 1 hoursize = 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) })})
tputkonen
The comment turned out so ugly that I edited my own answer.
tputkonen
A: 

hi, i am using hibernatejpavendoradapater, however i want to implement cache using eclipselink, do i have to change any thing in my spring configuration to make this working, please advise

praveen