前言:实体类Student.java Classes.java HIbernate测试工具类HibernateUtils.java 和上一篇博客一样,在此不再重复http://blog.csdn.net/tsfx051435adsl/article/details/77410879
新增加的实体类ClassesView.java
package com.web0819;
public class ClassesView {
private String cname;
private String sname;
public ClassesView(String cname, String sname) {
super();
this.cname = cname;
this.sname = sname;
}
@Override
public String toString() {
return "ClassesView [cname=" + cname + ", sname=" + sname + "]";
}
}
HQL一对多测试类HQLTest.java
package com.web0819;
import java.util.List;
import java.util.Set;
import org.hibernate.Query;
import org.hibernate.Session;
import org.junit.Test;
public class HQLTest {
@Test
public void test1() {
Session session = HibernateUtils.getSessionFactory().openSession();
System.out.println(session);
}
/**
* 实现classes与student的内连接
* Hibernate:
select
classes0_.cid as cid1_0_0_,
students1_.sid as sid1_1_1_,
classes0_.name as name2_0_0_,
students1_.cid as cid3_1_1_,
students1_.name as name2_1_1_
from
classes classes0_
inner join
student students1_
on classes0_.cid=students1_.cid
*/
@Test
public void testInnerJoin(){
Session session =HibernateUtils.getSessionFactory().openSession();
List list = session.createQuery("from Classes c inner join c.students").list();
for (Object object : list) {
// System.out.println((Classes)object); 会报错java.lang.ClassCastException 说明list里面不是Classes对象
}
session.close();
}
/**
* 迫切内连接
* Hibernate:
select
classes0_.cid as cid1_0_0_,
students1_.sid as sid1_1_1_,
classes0_.name as name2_0_0_,
students1_.cid as cid3_1_1_,
students1_.name as name2_1_1_,
students1_.cid as cid3_0_0__,
students1_.sid as sid1_1_0__
from
classes classes0_
inner join
student students1_
on classes0_.cid=students1_.cid
*/
@Test
public void testInnerJoin_fetch(){
Session session = HibernateUtils.getSessionFactory().openSession();
List list = session.createQuery("from Classes c inner join fetch c.students").list();
for (Object object : list) {
System.out.println((Classes)object);// 这个就不会报错 说明list里面不是Classes对象
}
session.close();
}
@Test
public void testInnerJoin_fetch2(){
Session session = HibernateUtils.getSessionFactory().openSession();
List list = session.createQuery("from Student s inner join fetch s.classes").list();
for (Object object : list) {
System.out.println((Student)object);// 这个就不会报错 说明list里面是Student对象
}
session.close();
}
/*
* 左外连接
* select c.*,s.*
from classes c left outer join student s on(s.cid=c.cid)
Hibernate:
select
classes0_.cid as cid1_0_0_,
students1_.sid as sid1_1_1_,
classes0_.name as name2_0_0_,
students1_.cid as cid3_1_1_,
students1_.name as name2_1_1_
from
classes classes0_
left outer join
student students1_
on classes0_.cid=students1_.cid
*/
@Test
public void testLeftJoin(){
Session session = HibernateUtils.getSessionFactory().openSession();
List list = session.createQuery("from Classes c left outer join c.students").list();
for (Object object : list) {
// System.out.println((Classes)object); 会报错java.lang.ClassCastException,说明List里面不是Classes对象
}
session.close();
}
/**
* 迫切左外连接
* Hibernate:
select
classes0_.cid as cid1_0_0_,
students1_.sid as sid1_1_1_,
classes0_.name as name2_0_0_,
students1_.cid as cid3_1_1_,
students1_.name as name2_1_1_,
students1_.cid as cid3_0_0__,
students1_.sid as sid1_1_0__
from
classes classes0_
left outer join
student students1_
on classes0_.cid=students1_.cid
*/
@Test
public void testLeftJoin_fetch(){
Session session = HibernateUtils.getSessionFactory().openSession();
List list = session.createQuery("from Classes c left outer join fetch c.students").list();
for (Object object : list) {
System.out.println((Classes)object); // 不会报错 说明list里面是Classes对象
Set<Student> students = ((Classes)object).getStudents();
for (Student student : students) {
System. out.println("student:" +student.getName());
}
}
session.close();
}
@Test
public void testLeftJoin_fetch2(){
Session session = HibernateUtils.getSessionFactory().openSession();
List list = session.createQuery("from Student s left outer join fetch s.classes").list();
for (Object object : list) {
System.out.println((Student)object); // 不会报错
}
session.close();
}
/**
*
* sql:select c.*,s.* from classes c,student s where c.cid=s.cid;
* hql:from Classes c,Student s where c.cid=s.classes.cid,注意与上句的区别;
* 得到的list是object[],数组中的元素是Classes和Student对象;
*/
@Test
public void testOneToMany_EQ(){
Session session = HibernateUtils.getSessionFactory().openSession();
Query query = session.createQuery( "from Classes c,Student s where c.cid=s.classes.cid");
List list = query.list();
for (Object object : list) {
System.out.println(((Object[])object)[0]);
System.out.println(((Object[])object)[1]);
}
session.close();
}
/**
* 2.带属性的查询;
* list中装的是object[];
*/
@Test
public void testOneToMany_EQ_Property(){
Session session = HibernateUtils.getSessionFactory().openSession();
Query query = session.createQuery( "select c.name,s.name from Classes c,Student s where c.cid=s.classes.cid");
List list = query.list();
for (Object object : list) {
System.out.println(((Object[])object)[0]);
System.out.println(((Object[])object)[1]);
}
session.close();
}
/**
* 3.带属性查询,将查询结果封装成一个bean;
* 得到的list中装的是classView对象;
*/
@Test
public void testOneToMany_EQ_Property_Constructor(){
Session session = HibernateUtils.getSessionFactory().openSession();
Query query = session.createQuery( "select new com.web0819.ClassesView(c.name,s.name) " +
"from Classes c,Student s where c.cid=s.classes.cid");
List<ClassesView> list = query.list();
for (ClassesView classesView : list) {
System.out.println(classesView);
}
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 = HibernateUtils.getSessionFactory().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");
//不要fetch;
buffer.append( "select new com.web0819.ClassesView(c.name,s.name) " +
" from Student s inner join s.classes c " );
Query query = session.createQuery(buffer.toString());
List<ClassesView> list = query.list();
for (ClassesView classView : list) {
System.out.println(classView);
}
session.close();
}
/**
* 9.迫切左外连接2
* 从学生出发,得到对应的班级
*/
@Test
public void testOneToMany_RightJoin_Fetch(){
Session session = HibernateUtils.getSessionFactory().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.getName());
if (student.getClasses()!=null) {
System. out.println(" " +student.getClasses().getName());
}
}
session.close();
}
/**
* 8.迫切左外连接
* 从班级出发,得到班级对应的学生
*/
@Test
public void testOneToMany_LeftJoin_Fetch(){
Session session = HibernateUtils.getSessionFactory().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.getName());
Set<Student> students = classes.getStudents();
for (Student student : students) {
System. out.println(" student:" +student.getName());
}
}
session.close();
}
}