hibernate之manyToMany查询错误

来源:互联网 发布:jdk 7u1 windows 7.0 编辑:程序博客网 时间:2024/06/05 04:15

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

原创粉丝点击