Does anyone know if HQL has a keyword to identify rows such as ROWID or ROWNUM?
I would like to implement pagination with HQL but I am not able to use .setMaxResult(
Pagination using Query Interface:
There are two methods of the Query interface for pagination.
1. Query setFirstResult(int startPosition): This method takes an integer that represents the first row in your result set, starting with row 0.
2. Query setMaxResults(int maxResult): This method tells Hibernate to retrieve a fixed number maxResults of objects. Using above two methods together, we can construct a paging component in our web or Swing application.
Example:
Query query = session.createQuery("FROM Employee");
query.setFirstResult(5);
query.setMaxResults(10);
List<Employee> list = query.list();
for(Employee emp: list) {
System.out.println(emp);
}
Pagination using Criteria Interface: There are two methods of the Criteria interface for pagination.
1. Criteria setFirstResult(int firstResult):
Set the first result to be retrieved.
2. List item Criteria setMaxResults(int maxResults):
Set a limit upon the number of objects to be retrieved.
Example:
Criteria criteria = session.createCriteria(Employee.class);
criteria.setFirstResult(5);
criteria.setMaxResults(10);
List<Employee> list = criteria.list();
for(Employee emp: list) {
System.out.println(emp);
}
Well, you can in principle access ROWNUM/ROWID from HSQL (though I've never used it). See e.g. Ron's Weblog. That should work.
But I'd like to point out that you're really working against Hibernate and HSQL if you do it like that. The proper way is to use setMaxResult() & friends. If you cannot do that b/c of your architecture, I'd at least reconsider my architectural decisions. I know these are always tough changes to make, but it might be worth it.
this is one situation where hibernate shines:
typical solution with hql query.
int elementsPerBlock = 10;
int page = 2;
return getSession().createQuery("from SomeItems order by id asc")
.setFirstResult(elementsPerBlock * (page-1) + 1 )
.setMaxResults(elementsPerBlock)
.list();
hibernate will translate this to a pattern that is understood by the database according to its sql dialect. on oracle it will create a subselect with ROWNUM < X. on postgresql it will issue a LIMIT / OFFSET on msSQL server it will issue a TOP..
to my knowledge it is not possible to achieve this with "pure" hql.