Let's say that I have a method responsible for building a query based on the parameters passed to it:
public Query<User> buildQuery(String name, String city) {
Session session = HibernateUtil.getSessionFactory().openSession();
String queryString = "from Users where 1 = 1 ";
if (name != null) queryString += "and name = :name ";
if (city != null) queryString += "and city = :city ";
Query<User> query = session.createQuery(queryString, User.class);
if (name != null) query.setParameter("name", name);
if (city != null) query.setParameter("city", city);
return query;
}
I don't like this because the logic is repeated two times (for adding the condition and for the setting of the parameter).
The only solution that came to my mind was to use a criteria query:
public Query<User> buildQuery2(String name, String city) {
Session session = HibernateUtil.getSessionFactory().openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = builder.createQuery(User.class);
Root<User> root = criteriaQuery.from(User.class);
Predicate predicate = builder.conjunction();
if (name != null) {
predicate = builder.and(predicate, builder.equal(root.get("name"), name));
}
if (city != null) {
predicate = builder.and(predicate, builder.equal(root.get("city"), city));
}
criteriaQuery.select(root).where(predicate);
Query<User> query = session.createQuery(criteriaQuery);
return query;
}
Is there a better solution for this?