Using Hibernate how would you design and implement a search criteria page (which has multiple editable/selectable fields/drop-downs as search criteria) such that queries shouldn't clutter data accessor code. I mean no query-string concatenation based on conditionals and ultimately all the queries should go in a separate xml file. I've done such an implementation using IBatis's dynamic queries. Couldn't find such thing in Hibernate so I started thinking what would be the elegant way to implement dynamic criteria based page in hibernate.
-
As far as the performance is concerned, I believe that criterion can be much better (and more cleanly) be implemented in IBatis. Hibernate just doesn't solve this problem that much cleanly but since it atleast does an effort in providing an API to do that, i'll accept the answer – user18943 Oct 21 '10 at 12:04
3 Answers
Sounds like you are looking for, unsurprisingly, the Criteria
API:
http://docs.jboss.org/hibernate/core/3.5/reference/en/html/querycriteria.html

- 47,174
- 11
- 83
- 83
as I had the same issue, I developed a Generic Dao class that allows dynamically(using reflection) to create the criteria based on the values assigned to the object and query the database
e.g
Country country = new Country();
// these values lets say they were assigned on your servlet based on the user post
country.setName("Luxembourg");
// This is where your service layer starts. It gets as a param the Country object
GenericDaoDB gDaoDB = new GenericDaoDB();
try{
List resultList = gDaoDB.list(country);
System.out.println("=========Result Print==============");
for(int i=0; i<resultList.size();i++){
Country resultCountry = (Country)resultList.get(i);
System.out.println("Name:"+ resultCountry.getName()+" Country Code:"+resultCountry.getCountryCode());
}
}catch(BasisException e){
e.printStackTrace();
}
If you like have a look on http://sourceforge.net/apps/wordpress/jprovocateur/2010/09/23/simple-example-hibernate-query-the-database-without-hql-or-criteria/ where you can find more details and the example project.
And as it is a generic class you can use it for all your Pojos

- 51
- 3
I second Affe's suggestion, the Criteria API is exactly what you're looking for and is recommended when dealing with dynamic queries. This is very nicely illustrated in Hibernate Querying 102 : Criteria API that I'm quoting below:
Using the Hibernate Criteria API
The Hibernate Criteria API provides an elegant way of building on-the-fly dynamic queries on Hibernate-persisted databases. Using this technique, the previous 24-line example can be coded more consicely and more clearly using a mere 8 lines of code :
Criteria criteria = session.createCriteria(Sale.class); if (startDate != null) { criteria.add(Expression.ge("date",startDate); } if (endDate != null) { criteria.add(Expression.le("date",endDate); } List results = criteria.list();
Let's have a look at the use of the Hibernate Criteria API in more detail.
The code shown in the article speaks for itself, just have a look.
Related questions
Resources

- 1
- 1

- 562,542
- 136
- 1,062
- 1,124