【发布时间】:2020-08-22 00:51:33
【问题描述】:
假设我有一个方法负责根据传递给它的参数构建查询:
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;
}
我不喜欢这样,因为逻辑重复了两次(用于添加条件和设置参数)。
我想到的唯一解决方案是使用条件查询:
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;
}
有没有更好的解决方案?
【问题讨论】:
标签: hibernate criteria named-parameters