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。不管了,先知道怎么用,有机会了看看源码,再慢慢理解吧。
- hibernate之manyToMany查询错误
- Hibernate注解之@ManyToMany
- 权限访问之判断——hibernate用户、角色、请求三表ManyToMany关联查询
- ManytoMany[Hibernate]
- Hibernate-----@ManyToMany
- 《Hibernate》-----ManyToMany
- Hibernate 表关系描述之ManyToMany
- 12hibernate hibernate的关系映射之ManyToMany(重点)
- 【Hibernate】manyTomany练习
- Hibernate @ManyToMany -- 1
- Hibernate @ManyToMany -- 2
- Hibernate (六) ManyToMany
- 实体关系之@ManyToMany
- 实体关系之@ManyToMany
- 实体关系之@ManyToMany
- Hibernate查询错误
- Hibernate 时间查询错误
- 【原创】Hibernate的manytomany例子..
- 五个免费的轻量级Linux发行版
- 通过上下文context操作文件
- boost之spirit学习-mini_c(4)
- 成功不易
- hibernate批量处理
- hibernate之manyToMany查询错误
- 抽象工厂模式
- C中的静态数据区、代码区、堆、栈
- java的Error和Exception的区别联系
- 最近需要完成的事情
- 软件工厂是否真的可能存在?
- sdcard操作
- 工厂方法和抽象工厂
- heap stack区别简介