一个教师表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。不管了,先知道怎么用,有机会了看看源码,再慢慢理解吧。