I am using org.hibernate.Query
Api to query for result. But i ran into strange problem.
This is suppose my query select DISTINCT abc FROM ABC abc where ORDER BY abc.name ASC
.
I have tested this with Oracle database
.
let say i have code as below
public static List executeQuery(EntityManager em, Query query) {
org.hibernate.Query hibernateQuery = query.unwrap(org.hibernate.Query.class);
// this piece of code is used to fetch data from cache based on id
if(EntityCacheable){
Iterator<Entity> it = hibernateQuery.iterate();
return "";
}else{
//This finnaly return the result
return query.getResultList();
}
}
Now the problem is for the above query, hibernateQuery.iterate()
generates query like below
select abc.id FROM ABC abc where ORDER BY abc.name ASC
, which is not valid. Since what you have in order by clause
should be there in select clause
also.
But query.getResultList()
generates something as below,
select abc.id, abc.name FROM ABC abc where ORDER BY abc.name ASC
-- so i am safe here
I can make changes in my query and proceed further, but is this an issue in Hibernate API
or what.
This does not seems to be an issue with
Hibernate API
, infact this the desired behaviour.Query.iterate():
Return the query results as an
Iterator
. If the query contains multiple results pre row, the results are returned in an instance ofObject[]
.Entities
returned as results are initialized on demand. The first SQL query returnsidentifiers
only.Executes
1+N SQL
queries. The first query only returns the identifier of all the records and when the returned iterator is iterated then each time a separate SQL query is executed that contains a WHERE clause likeWHERE id=N
. If the records are present in cache then the first query is executed and the rest N queries are not executed and records are obtained from cache.Query.getResultList():
Executes 1 SQL query
and loads the entire data. Even if the records are present in cache a fresh SQL query is executed to load the records from the database.