package com.nf;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import shuang.m2oo2m.Person;
import util.HibernateUtil;public classMain {public static voidmain(String[] args) {//多表连接//内连接//innerQuery();//左外连接1:以Person为主表//leftOuterJoin();//左外连接2:以ClassInfo为主表//leftOuterJoin2();
fetchJoin() ;
}private static voidinnerQuery() {
SessionFactory sf=HibernateUtil.getSessionFactory();
Session s=sf.openSession();
Transaction tx=s.beginTransaction();/*inner join p.ci中的p.ci是通过实体对象Person中的属性ci映射找到对应的班级信息而来*/String hql= "select p from Person p inner join p.ci c";
Query q=s.createQuery(hql);
List list =q.list();for(Person p: list){
System.out.println(p);
}
tx.commit();
s.close();
sf.close();/*结果
Person [pid=p1, name=p111]
Person [pid=p2, name=p222]
Person [pid=p3, name=p333]
Person [pid=p4, name=p444]
**/}private static voidleftOuterJoin() {
SessionFactory sf=HibernateUtil.getSessionFactory();
Session s=sf.openSession();
Transaction tx=s.beginTransaction();
String hql= "select p from Person p left join p.ci c";
Query q=s.createQuery(hql);
List list =q.list();for(Person p: list){
System.out.println(p);
}/*结果
Person [pid=p1, name=p111]
Person [pid=p2, name=p222]
Person [pid=p3, name=p333]
Person [pid=p4, name=p444]
Person [pid=p5, name=p555]
**/tx.commit();
s.close();
sf.close();
}/** 此方法演示的是,链接的时候,如果select多个实体
* 返回的是对象数组,而不是Person 的list集合
* 这样导致取数据的时候麻烦*/
private static voidleftOuterJoin2() {
SessionFactory sf=HibernateUtil.getSessionFactory();
Session s=sf.openSession();
Transaction tx=s.beginTransaction();
String hql= "select p,c from Person p left join p.ci c";
Query q=s.createQuery(hql);
List list =q.list();for(Object[] data: list){
System.out.println(data[0]);
System.out.println(data[1]);
}/*结果
Person [pid=p1, name=p111]
ClassInfo [cid=c111, name=banji1]
Person [pid=p2, name=p222]
ClassInfo [cid=c111, name=banji1]
Person [pid=p3, name=p333]
ClassInfo [cid=c222, name=banji2]
Person [pid=p4, name=p444]
ClassInfo [cid=c222, name=banji2]
Person [pid=p5, name=p555]
null
**/tx.commit();
s.close();
sf.close();
}/*返回的是整个Person类里有的所有属性*/
private static voidfetchJoin() {
SessionFactory sf=HibernateUtil.getSessionFactory();
Session s=sf.openSession();
Transaction tx=s.beginTransaction();
String hql= "select p from Person p left join fetch p.ci c";
Query q=s.createQuery(hql);
List list =q.list();for(Person p: list){
System.out.println(p);
System.out.println(p.getCi().getName());
}/*结果:
Person [pid=p1, name=p111]
banji1
Person [pid=p2, name=p222]
banji1
Person [pid=p3, name=p333]
banji2
Person [pid=p4, name=p444]
banji2
Person [pid=p5, name=p555]
**/tx.commit();
s.close();
sf.close();
}
}