hibernate 查询应用总结(一)

今天主要总结hibernate的Criteria标准查询,Criteria(标准)查询的功能非常强大,只要sql语句能解决的他就能解决,主要包括Example(示例查询),Restrictions(限制),Projections(投影),还有aggregation(聚会),离线查询,子查询。其中重点讲解关联查询,可以通过criteria.createCriteria()方法或criteria.createAlias()方法进行关联查询。我碰到了一个非常复杂的关联查询,sql语句如下:

 String sql = select cp.id from ctl_project cp left join ctl_change_info cci on cci.ctl_project_id = cp.id group by cci.ctl_project_id having sum(CHAR_LENGTH(replace(cci.change_content_type,'conf',''))< CHAR_LENGTH(cci.change_content_type)) >=0 and cp.id in(select max(id) from ctl_project cp2 group by sale_no,intby2 ); 

  

其中ctl_project和ctl_change_info是一对多的关系,实现方法有两种:

一是直接执行sql语言:getSession().createSQLQuery("上述语句").getEntity(CtlProject.Class).list()。

另一种是要重点强调的,就是在criteria的基础之上添加原始的sql语句,因为要用到left join,所以原本简单的问题有点复杂了。试用了很多种方法,

(1)createAlias("ctlChangeInfo","change").add(Restrictions.sqlRestriction("上述语句on cci.ctl_project_id = cp.id 后面部分语句")),

(2)criteria.add(Restrictions.sqlRestriction("上述语句on 后面部分语句"))等等,能想到的几乎都想到了,都没效果,加了几次班,终于在今天周五把问题解决了,能过一个轻松的周末了,真有一种说不出的喜悦和高兴,就像打了一场胜仗一样。其实很简单:cr.createAlias("ctlChangeInfos", "change").add(Restrictions.sqlRestriction("上述语句on cci.ctl_project_id = cp.id之后,group by之前");但是要在group by之前添加“1=1” ,并且要将cp改成this_,将cci改成change1_就ok了,加“1=1”是因为criteria的add方法生成了where这一关键字,所以直接加“group by”是不行的,必须是“where 1=1 group by……”要加至于为什么要改成this_和change1_,这是hibernate运用时的别名,通过查看生成的sql语句得到的。

本文书写比较混乱,没有实际的参考价值,仅作为本人的总结。

猜你喜欢

转载自liugang-ok.iteye.com/blog/1124719