一个教师表teacher,一个科目表course,两个表之间多对多关联,用中间表teacher_course关联。
@ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="teacher_course",joinColumns={@JoinColumn(name="teacherid")},inverseJoinColumns={@JoinColumn(name="courseid")})
然后进行动态条件查询
public SearchResult selectForPage(final SearchResult searchResult) throws Exception { // TODO Auto-generated method stub List list = (List)template.execute( new HibernateCallback<Object>(){ public Object doInHibernate(Session session) throws HibernateException,SQLException{ Criteria criteria= session.createCriteria(Teacher.class) ;criteria.setFetchMode("courseList", FetchMode.SELECT) ;
String teacher_name = searchResult.getQueryParam().get("teacher_name")==null?null:searchResult.getQueryParam().get("teacher_name").toString() ; String teacher_teaNu = searchResult.getQueryParam().get("teacher_teaNu")==null?null:searchResult.getQueryParam().get("teacher_teaNu").toString() ; if(teacher_name!=null&&teacher_name.length()>0){ criteria.add(Restrictions.like("name","%"+teacher_name+"%")) ; } if(teacher_teaNu!=null&&teacher_teaNu.length()>0){ criteria.add(Restrictions.like("teaNu","%"+teacher_teaNu+"%")) ; } Object o = criteria.setProjection(Projections.rowCount()).uniqueResult() ; criteria.setProjection(null) ; int totalRow = Integer.parseInt(o.toString()) ; searchResult.init(totalRow) ; if(searchResult.getSortField()==null||searchResult.getSortField().length()<=0){ searchResult.setSortField("id") ; } if(searchResult.getSortType()==1){ criteria.addOrder(Order.asc(searchResult.getSortField())) ; }else{ criteria.addOrder(Order.desc(searchResult.getSortField())) ; } criteria.setFirstResult(searchResult.getStartRow()) ; criteria.setMaxResults(searchResult.getPageSize()) ; return criteria.list(); } }); searchResult.setList(list) ; return searchResult; }
没有红字之前,总是出错,后来发现原来是返回的类型为object[],而不是希望得到的teacher,很是郁闷,查了好多资料,又是别名,又是新createCriteria的,都不行,最后把
@ManyToMany(fetch=FetchType.EAGER)
改为
@ManyToMany(fetch=FetchType.LAZY)
竟然可以转换为teacher类型了,很奇怪吧?
可是,成为lazy类型的,只能在session关闭之前使用,因为是代理对象。即使可以通过filter延长session的生存期,但是页面加载之后也会自动关闭session,而有的时候还就是想直接使用,不想再进行烦锁的数据库操作。于是,就改成了上面红色的语句,嘿嘿,行了。
还不了解为什么用延迟加载可以,但是用预初始化就出错。而且,如果用hibernateTemplate.get()就可以直接得到子对象,而且返回的sql语句和用criteria.list返回的一个,但是criteria就不能将其生成teacher 对象,感觉应该是一个bug。不管了,先知道怎么用,有机会了看看源码,再慢慢理解吧。