关闭

hibernate之manyToMany查询错误

1336人阅读 评论(0) 收藏 举报

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:148020次
    • 积分:1998
    • 等级:
    • 排名:第19593名
    • 原创:38篇
    • 转载:80篇
    • 译文:0篇
    • 评论:17条
    文章分类
    最新评论