等值连接
SELECT c.*,s.* FROM Classes c,Student s WHERE c.cid=s.cid
内连接
SELECT c.*,s.* FROM Classes c INNER JOIN Student s ON (c.cid = s.cid)
左外连接
SELECT c.*,s.* FROM Classes c LEFT OUTER JOIN Student s ON c.cid = s.cid
public class OneToMoreTest extends HibernateUtil{
/**
#等值连接
SELECT c.*,s.* FROM Classes c,Student s WHERE c.cid=s.cid
*/
@Test
public void testEQ(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("from com.sanmao.utils.Classes c" +
",com.sanmao.utils.Student s where c.cid=s.cleass.cid");
List list=query.list();
// 返回的是一个Object数组,元素包括Object(Classes Student)
session.close();
}
/**
#内连接
SELECT c.*,s.* FROM Classes c INNER JOIN Student s ON (c.cid = s.cid)
*/
@Test
public void testIN(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("from com.sanmao.utils.Classes c inner join c.students s");
List list=query.list();
// 返回的是一个Object数组,元素包括Object(Classes Student)
// 和等值效果相同
session.close();
}
/**
左外连接
SELECT c.*,s.* FROM Classes c LEFT OUTER JOIN Student s ON c.cid = s.cid
*/
@Test
public void testLO(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("from com.sanmao" +
".utils.Classes c left outer join c.students s");
List list=query.list();
// 返回的是一个Object数组,元素包括Object(Classes Student)
// 和等值效果相同
session.close();
}
/**
* 迫切内连接
* */
@Test
public void testInner_Fetch(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("from com.sanmao" +
".utils.Classes c inner join fetch c.students s");
List<Classes> list=query.list();
//返回所有拥有学生的班级
for (Classes classes: list
) {
System.out.println(classes);
}
session.close();
}
/**
* 迫切外连接
* */
@Test
public void testOuter_Fetch(){
Session session=sessionFactory.openSession();
Query query=session.createQuery("from com.sanmao" +
".utils.Classes c left outer join fetch c.students s");
//返回所有班级,包括有学生和没有学生的班级
List<Classes> list=query.list();
for (Classes classes: list
) {
System.out.println(classes);
}
session.close();
}
/**
* 两个字段来自不同的表的查询
* 值得注意的是 当用new 的时候会和 fetch (迫切连接)造成冲突
* */
@Test
public void testClassesView(){
Session session=sessionFactory.openSession();
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("select new com.sanmao.utils.ClassesView(c.name,s.name)");
stringBuffer.append("from Classes c inner join c.students s");
List<ClassesView> list=session.createQuery(stringBuffer.toString()).list();
for (ClassesView cv: list
) {
System.out.println(cv);
}
session.close();
}
}