在多对多的关系typedquery问题,怎么解决人际关系问题

Access denied | www.supmen.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.supmen.com) has banned your access based on your browser's signature (ef53b4-ua98).没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!hql多对一关联查询问题_百度知道
hql多对一关联查询问题
以下使用hibernate
现在有个学生表,与一个班级表。多对一关系。
学生表classid关联班级表的id。
但现在有个需求,当我删除班级表的部分数据后。查询学生表时找不到对应班级后,如何排除这个错误。
比如将找不到班级的学生排除出去,或者在班级列上显示一...
仅执行query.list()就过不去了,还如何前台判断。 问题解决了,自己回答下,将lazy=&false&去掉,让他延迟加载。这样在页面就会为空,但不会报错。这时在struts2标签显示页中,对字段进行判断&s:if test=&#student.team.name.length()&0&&就可以将已删除的班级标注出来了。但用el表达式还是报错,而且无法判断student.team是否为空。
我有更好的答案
实体:class Students{
get...set...;}calss Clazz{
private S}前台判断student.getClazz()==null,则提示。
采纳率:27%
将cascade属性设置一下,选择是不是级联删除
在学生表设置外键的时候 设置级联置空
设置级联删除
其他3条回答
为您推荐:
其他类似问题
hql的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一、一对多
以班级Classes和学生Student为例:
回忆sql语句:
//内链接,两种方式效果一样,查询的是两边都有的数据
SELECT c.*,s.* FROM classes c,student s WHERE s.cid=c.SELECT c.cname,s.sname FROM classes c INNER JOIN student s ON s.cid=c.
//左外连接,在内链接基础上,左边表有而右边表没有,两种方式等效;SELECT c.* ,s.* FROM student s LEFT OUTER JOIN classes c ON s.cid=c.SELECT c.* ,s.* FROM student s LEFT& JOIN classes c ON s.cid=c.//右外连接,在内链接基础上,右边有而左边无,两种方式等效;SELECT c.* ,s.* FROM classes c RIGHT& OUTER JOIN student s ON s.cid=c.SELECT c.* ,s.* FROM classes c RIGHT& JOIN student s ON s.cid=c.
//查询所有:
from Classes c,Student s where c.cid=s.classes.cid;
//选择某些属性查询
select c.cname,s.sname from Classes c,Student s where c.cid=s.classes.cid;
//选择某些属性,封装为bean查询;
select new cn.itheima03.hibernate.domain.ClassesView(c.cname,s.sname) &from Classes c,Student s where c.cid=s.classes.cid;
//内链接查询,得到的是两个bean
from Classes c inner join c.students s;
//内敛链接查询,得到的是Classes对象,对象中包含studet集合
from Classes c inner join fetch c.students s;
from Student s inner join fetch s.classes c;
select new cn.itheima03.hibernate.domain.ClassesView(c.cname,s.sname)&&from Student s inner join& s.classes c ;
from Classes c left outer join fetch c.students s;
from Student s left outer join fetch s.classes;
示例代码:
&&&&& * 1.一对多
&&&&& * sql:select c.*,s.* from classes c,student s where c.cid=s.
&&&&& * hql:from Classes c,Student s where c.cid=s.classes.cid,注意与上句的区别;
&&&&& * 得到的list是object[],数组中的元素是Classes和Student对象;
&&&&&@Test
&&&&&public&void&testOneToMany_EQ(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&& Query query = session.createQuery(&"from Classes c,Student s where c.cid=s.classes.cid");
&&&&&&&&&List&list&= query.list();
&&&&&&&& System.&out.println(query.list().size());
&&&&&&&& session.close();
&&&&& * 2.带属性的查询;
&&&&& * list中装的是object[];
&&&&&@Test
&&&&&public&void&testOneToMany_EQ_Property(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&& Query query = session.createQuery(&"select c.cname,s.sname from Classes c,Student s where c.cid=s.classes.cid");
&&&&&&&& query.list();
&&&&&&&& session.close();
&&&&& * 3.带属性查询,将查询结果封装成一个bean;
&&&&& * 得到的list中装的是classView对象;
&&&&&@Test
&&&&&public&void&testOneToMany_EQ_Property_Constructor(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&& Query query = session.createQuery(&"select new cn.itheima03.hibernate.domain.ClassesView(c.cname,s.sname) "&+
&&&&&&&& &&&&&&&"from Classes c,Student s where c.cid=s.classes.cid");
&&&&&&&&&List&list&= query.list();
&&&&&&&& session.close();
&&&&& * 4.内连接
&&&&& * 结果与例子1一样;
&&&&&@Test
&&&&&public&void&testOneToMany_InnerJoin_Query(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Classes c inner join c.students s");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& query.list();
&&&&&&&& session.close();
&&&&& * 5.迫切内连接1:获取所有有学生的班级及班级下的学生;
&&&&& * 要想得到的集合中装的Classes对象,对象中set集合中装student,可以使用迫切内链接。
&&&&&@Test
&&&&&public&void&testOneToMany_InnerJoin_Fetch_Query_1(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Classes c inner join fetch c.students s");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&&&List&list&= query.list();
&&&&&&&& session.close();
&&&&& * 6.迫切内连接2
&&&&& * 从学生端出发;
&&&&&@Test
&&&&&public&void&testOneToMany_InnerJoin_Fetch_Query_2(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Student s inner join fetch s.classes c");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& query.list();
&&&&&&&& session.close();
&&&&& * 7.迫切内连接3:获取属性,封装结果;
&&&&& * select new cn.itheima03.hibernate.domain.ClassView(c.cname,s.sname)
&&&&& * &&from Student s inner join fetch s.classes c;
&&&&& * 上述的&hql语句会报错,因为from后面想要的结构和select想要的结构是冲突的,所以
&& &&&&&&&如果在from后面加fetch,不能写select语句,如果加select,不能写fetch,两者只能选择其一
&&&&&@Test
&&&&&public&void&testOneToMany_InnerJoin_Fetch_Query_Property(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&&//下面的写法不对;
//&&&&&&&&buffer.append("select new cn.itheima03.hibernate.domain.ClassView(c.cname,s.sname) " +
//&&&&&&&&&&&&&&&&&" from Student s inner join fetch s.classes c");
&&&&&&&&&&
&&&&&&&&&&&//不要
&&&&&&&&&&buffer.append(&"select new cn.itheima03.hibernate.domain.ClassesView(c.cname,s.sname)& "&+
&&&&&&&&&&&"& from Student s inner join& s.classes c "&);
&&&&&&&&&&
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&&&List&list&= query.list();
&&&&&&&& session.close();
&&&&& * 8.迫切左外连接
&&&&& * 从班级出发,得到班级对应的学生
&&&&&@Test
&&&&&public&void&testOneToMany_LeftJoin_Fetch(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Classes c left outer join fetch c.students s");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& List&Classes& list =&query.list();
&&&&&&&&&for&(Classes classes : list) {
&&&&&&&&&&&&&&&System.&out.println("classes:"&+classes.getCname());
&&&&&&&&&&&&&&Set&Student& students = classes.getStudents();
&&&&&&&&&&&&&&&for&(Student student : students) {
&&&&&&&&&&&&&&&&&&&System.&out.println("&&&&&student:"&+student.getSname());
&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&&&& session.close();
&&&&& * 9.迫切左外连接2
&&&&& * 从学生出发,得到对应的班级
&&&&&@Test
&&&&&public&void&testOneToMany_RightJoin_Fetch(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Student s left outer join fetch s.classes ");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& List&Student& list =&query.list();
&&&&&&&&&for&(Student student : list) {
&&&&&&&&&&&&&&&System.&out.println("student:"&+student.getSname());
&&&&&&&&&&&&&&&if&(student.getClasses()!=null) {
&&&&&&&&&&&&&&&&&&&System.&out.println("&&&&&"&+student.getClasses().getCname());
&&&&&&&&&&&&&&}
&&&&&&&&&&}
&&&&&&&& session.close();
二。多对多
学生Student和课程Course为例:
Student里有装Course的set集合,Course里也有装Student的set集合;
多对多与一对多操作差不多
&&&&& * 1.得到所有的学生以及其对应的课程
&&&&& * 从学生端出发
&&&&& * list装的是学生;
&&&&&@Test
&&&&&public&void&testManyToMany_LeftJoin_Fecth(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Student s left outer join fetch s.courses");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&&&List&list&= query.list();
&&&&&&&& session.close();
&&&&& * 2.得到所有的课程及课程下对应的学生;
&&&&& * list装的是课程
&&&&&@Test
&&&&&public&void&testManyToMany_LeftJoin_Fecth_2(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Course c left outer join fetch c.students s");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& query.list();
&&&&&&&& session.close();
&&&&& * 3.一对多和多对多的结合
&&&&& * 得到所有班级下的所有学生以及所有学生下的所有课程;
&&&&& * 从班级出发
&&&&&@Test
&&&&&public&void&testManyToManyAndOneToMany(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Classes c left outer join fetch"&+
&&&&&&&&&&&&&&&&&&&&" c.students s left outer join fetch s.courses");
&&&&&&&&&&
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& List&Classes& classeList =&query.list();
&&&&&&&&&//去掉集合中的重复元素
&&&&&&&& Set&Classes& sets =&new&HashSet&Classes&(classeList);
&&&&&&&& classeList =&new&ArrayList&Classes&(sets);
&&&&&&&& System.&out.println(classeList.size());
&&&&&&&&&for(Classes classes:classeList){//遍历班级
&&&&&&&& &System.&out.println(classes.getCname());
&&&&&&&& &Set&Student& students = classes.getStudents();//得到班级下的学生
&&&&&&&& &&for(Student student:students){//遍历学生
&&&&&&&& &&&&&&System.&out.println(student.getSname());
&&&&&&&& &&&&&&Set&Course& courses = student.getCourses();
&&&&&&&& &&&&&&&for(Course course:courses){//遍历学生下的课程
&&&&&&&& &&&&&&&&&&System.&out.println(course.getCname());
&&&&&&&& &&&&&&}
&&&&&&&& &}
&&&&&&&& }
&&&&&&&& session.close();
&&&&& * 从中间表出发,班级有学生,学生修课程,故从学生角度出发进行查询;
&&&&&@Test
&&&&&public&void&testManyToManyAndOneToMany_2(){
&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&StringBuffer buffer =&new&StringBuffer();
&&&&&&&&&&buffer.append(&"from Student s left outer join fetch s.classes c&
& & & & & & & & & & & & & &left outer join fetch s.courses cc");
&&&&&&&& Query query = session.createQuery(buffer.toString());
&&&&&&&& List&Student& studentList =&query.list();
&&&&&&&&&for(Student student:studentList){
&&&&&&&& &System.&out.println(student.getSname());
&&&&&&&& &Classes classes = student.getClasses();
&&&&&&&& &System.&out.println(classes.getCname());
&&&&&&&& &Set&Course& courses = student.getCourses();
&&&&&&&& &&for(Course course:courses){
&&&&&&&& &&&&&&System.&out.println(course.getCname());
&&&&&&&& &}
&&&&&&&& }
&&&&&&&& session.close();
&&&&&/*******************************************************************************/
&&&&&&&&/**
&&&&&&&& * 面向对象的查询
&&&&&&&& */
&&&&&&&&&&&@Test
&&&&&&&&&&&public&void&testQueryCriteria(){
&&&&&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&&&&&List&Classes&& classesList =&session.createCriteria(Classes.class).list()&;
&&&&&&&&&&&&&&System.&out.println(classesList.size());
&&&&&&&&&&&&&&session.close();
&&&&&&&&&&}
&&&&&&&&&&
&&&&&&&&&&&@Test
&&&&&&&&&&&public&void&testQueryCriteria_Where(){
&&&&&&&&&&&&&&Session&&&session =&sessionFactory.openSession();
&&&&&&&&&&&&&&Classes classes = (Classes)session.createCriteria(Classes.class).add(Restrictions.eq("cid"&, 1L)).uniqueResult();
&&&&&&&&&&&&&&System.&out.println(classes.getCname());
&&&&&&&&&&&&&&session.close();
&&&&&&&&&&}
无论是一对多还是多对多,hql语句中含有fetch时,得到的list装的是From 后面的对象,对象中可能有相关联对象的集合或者对象;
阅读(...) 评论()java框架hibernate如何用hql语句查询多对多关联关系_百度知道
java框架hibernate如何用hql语句查询多对多关联关系
Teacher实体类如下:
public class Teacher {
private Set&Student&
//setter和getter方法
public class Student {
private int ...
中间表已经配好了 配置关联关系不用你管
我有更好的答案
Query query = session.createQuery(“select s.students from Teacher s where s.name= 'xxx' ”);List list = query.list();for (int i=0;i&list.size(); i++){
Student stu = (Student)list.get(i);
System.out.println(stu.getName());}
采纳率:91%
来自团队:
这两个类的数据库表需要一个中间表来连接他们。虽然学过但是没咋用过,所以无法直接给你答案。这是我在网上找的供你参考,希望对你有帮助。
我都问查询了 能不配中间表么 你回答的对我没用
本回答被网友采纳
from Student where teacherId=...
为您推荐:
其他类似问题
hql的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 query 关系不存在 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信