Hibernate中离线查询DetachedCriteria案例

Hibernate中离线查询经常用到。
问题:但当查询条件并不仅仅涉及到一个实体,而是还含有关联的实体中的属性时,就不知道怎么弄了。自己摸索了好久才发现原来API中已经提供了相应的解决方法。

情况1:
涉及到一个实体
Hibernate中离线查询DetachedCriteria案例_第1张图片
查询条件涉及到的是Goods,如果查询时查询的是Goods表,那简单了
Service层
public List findByCondition(Goods goods) {
	DetachedCriteria dc=DetachedCriteria.forClass(History.class);
	if(goods().getNm()!=null){
		dc.add(Restrictions.like("nm", "%"+goods().getNm()+"%"));
	}
	……
	return goodsDao.findByDetached(dc);
}

情况2:
但实际情况是:这是查询出入库操作历史的查询页面,所以Action中使用模型驱动时的 Model是History而非Store了,尽管这些参数最终还是封装到了History关联的Goods中。自然的传到Service层时的参数就不是上面代码中的Goods了,而是History了。这是就要用到”取别名“方式了。
public List findByCondition(History history) {
	DetachedCriteria dc=DetachedCriteria.forClass(History.class,"h");//别名:History对应h
	dc.createAlias("h.goods", "g");//别名:Goods对应g
	dc.createAlias("h.goods.store","s");//别名:Store对应s
	if(history.getGoods().getNm()!=null){
		dc.add(Restrictions.like("g.nm", "%"+history.getGoods().getNm()+"%"));
	}
	if(history.getGoods().getName()!=null){
		dc.add(Restrictions.like("g.name", "%"+history.getGoods().getName()+"%"));
	}
	if(history.getGoods().getStore()!=null){
		dc.add(Restrictions.like("s.id", "%"+history.getGoods().getStore().getId()+"%"));
	}
	return historyDao.findByDetached(dc);
}

你可能感兴趣的:(Hibernate中离线查询DetachedCriteria案例)