Spring框架下如何为Hibernate Criteria传递对象变量?
如何将对象变量传入Hibernate Criteria的限制条件?
我看你已经搭建好了Spring整合Hibernate的DAO基础结构,接下来咱们就把Event对象的属性值作为Criteria的查询限制条件加进去,核心思路是判断对象属性是否非空,然后针对性添加查询条件,避免空值干扰查询结果。
1. 基础实现步骤
- 首先创建Criteria实例,指定要查询的实体类:
Criteria criteria = session.createCriteria(Event.class); - 遍历Event对象的属性,只给非空的属性添加限制条件(比如type、name这些):
// 处理type属性:如果非空则添加等于条件 if (event.getType() != null && !event.getType().trim().isEmpty()) { criteria.add(Restrictions.eq("type", event.getType())); } // 处理name属性:如果非空可以用精确匹配或者模糊匹配 if (event.getName() != null && !event.getName().trim().isEmpty()) { // 精确匹配 criteria.add(Restrictions.eq("name", event.getName())); // 如果需要模糊匹配,换成下面的 // criteria.add(Restrictions.like("name", "%" + event.getName() + "%")); } - 最后执行查询并返回结果:
List<Event> eventList = criteria.list();
2. 补全你的完整代码
把这些逻辑整合到你的getAll方法里,还要记得处理事务和关闭session的问题(避免资源泄漏),完整代码如下:
@Repository public class EventSearchDAOImpl implements EventSearchDAO<Event> { @Autowired private SessionFactory sessionFactory; private Session session; private Transaction trans; @Override public List<Event> getAll(Event event) { List<Event> eventList = new ArrayList<>(); try { session = sessionFactory.openSession(); trans = session.beginTransaction(); // 打印传入的对象属性值,方便调试 System.out.println(event.getType() + " | " + event.getName()); // 创建Criteria实例 Criteria criteria = session.createCriteria(Event.class); // 添加非空属性的查询条件 if (event.getType() != null && !event.getType().trim().isEmpty()) { criteria.add(Restrictions.eq("type", event.getType())); } if (event.getName() != null && !event.getName().trim().isEmpty()) { criteria.add(Restrictions.eq("name", event.getName())); // 模糊匹配可选:criteria.add(Restrictions.like("name", "%" + event.getName() + "%")); } // 执行查询 eventList = criteria.list(); trans.commit(); } catch (Exception e) { if (trans != null) { trans.rollback(); } e.printStackTrace(); } finally { if (session != null && session.isOpen()) { session.close(); } } return eventList; } }
3. 额外注意事项
- 记得导入Hibernate的
Restrictions类:import org.hibernate.criterion.Restrictions; - 如果你的Event对象有其他类型的属性(比如日期、数值),可以用对应的Restrictions方法,比如
Restrictions.ge("createTime", event.getCreateTime())(大于等于) - 如果需要多条件组合(比如AND/OR),可以用
Restrictions.conjunction()(AND)或者Restrictions.disjunction()(OR)来包装条件
内容的提问来源于stack exchange,提问作者turing042
相关产品推荐
相关产品推荐

