hibernate之manyToMany查询错误

原创 2012年03月28日 00:10:40

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

相关文章推荐

关于HQL Criteria Restrictions.eq 两表关联和三表关联查询分析总结笔记

两表关联 TBorrow表和TUser表关联ID查询,依据  DetachedCriteria criteria = DetachedCriteria.forClass(TBorr...
  • c1989928
  • c1989928
  • 2013年07月29日 10:11
  • 14114

ManyToMany(基于注解)使用之进阶(中级版)

社团和成员就是多对多的关系,一个成员有多个社团,一个社团也有多个成员,这里的多对多映射采用中间表连接的映射策略,建立中间表的映射策略,建立中间表分别引入俩边的主键作为外键。通过中间表映射俩个表之间的关...

jpa manyTOMany

看了好多资料,终于弄出来了import java.util.Set;import javax.persistence.Entity;import javax.persistence.ManyToMan...

Hibernate之模拟三表问题之多对多manytomany之映射为3表注解版-与(十七)xml版本对应(二十三)

1 package com.bjsxt.hibernate; import java.util.HashSet; import java.util.Set; import javax.persis...

Hibernate 表关系描述之ManyToMany

Hibernate 表关系描述之ManyToMany  上篇写了一对一,那么在这篇我们讲一对多,那么在表中的一对多,是使用外键关联,通过一张表的一个键另一个表的外键来建立一多关系;  而在...

Hibernate ManyToMany 删除两个实体的关联

在我的工程中,有这么两个实体:GrowthDiary.java(成长日记)和DiaryTag.java(日记标签)。 大概就是和csdn发表文章给文章打标签一个意思吧。 现在我想在后台管理平台删除...

hibernate中的@OneToMany、@ManyToOne以及@ManyToMany

@OneToMany、@ManyToOne以及@ManyToMany讲解 一、一对多(@OneToMany) 1、单向一对多模型 假设通过一个客户实体可以获得多个地址信息。 对于一对多的实体关系...

Hibernate注解之@ManyToMany

当两个类(a,b)使用@ManyToMany注解时,会产生一个中间表a_b,该中间表表示两个类的关联关系,此时有两种情况:只有一端(类)维护该关联关系,两端(类)均可维护该关联关系。现有一新闻类Lab...

Hibernate注解中的manytomany级联与不级联删除问题的解决

两个类用户信息和用户Tag类型  多对多的关系 1.用户信息类 package com.yunmiao.bean.player; import java.util.Date; import ja...
  • he90227
  • he90227
  • 2015年08月31日 15:31
  • 3834

Hibernate学习总结:ManyToMany双向关联

说明: 一、一个老师可以教许多学生,并且一个学生可以有许多老师。 二、本次使用的Hibernate版本是hibernate-release-4.3.11.Final. ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate之manyToMany查询错误
举报原因:
原因补充:

(最多只允许输入30个字)