最近在一次電話面試中,被問到這么個問題。
文章參考:
http://369619017.blog.163.com/blog/static/7628038520098186273313/ package com.shiryu.otm;
import java.util.Iterator;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
//hql 的聯合查詢
public class HqlTest {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
// 1.Inner Join 返回所有滿足關聯條件的記錄組合
// 使用fetch關鍵字表明Address對象屬性讀出后立即填充到對應的User對象(addresses集合屬性)中
// 如果不使用fetch 結果集中,每個條目都是一個Object數組
Session session = sessionFactory.openSession();
String hql = "from User user inner join fetch user.addresses";
Iterator it = session.createQuery(hql).list().iterator();
while (it.hasNext()) {
User user = (User) it.next();
System.out.println(user.getId() + " " + user.getName() + " " + user.getAddresses());
}
session.close();
// 2.Left outer join
// 返回User表中所有的記錄(hql中位于左側的表),及其對應的地址信息,如果沒有則用null代替
Session session1 = sessionFactory.openSession();
Transaction tr1 = session1.beginTransaction();
String hql2 = "from User user left join fetch user.addresses";
Iterator it2 = session1.createQuery(hql2).list().iterator();
while (it2.hasNext()) {
User user = (User) it2.next();
System.out.println(user.getId() + " " + user.getName() + " " + user.getAddresses());
}
session1.close();
// right outer join 則與left相反 fetch 對其無效
// full join 是left outer join和right outer join的并集
// 4.6.8子查詢的使用
Session session2 = sessionFactory.openSession();
Transaction tr2 = session2.beginTransaction();
String hql3 = "from User user where (select count(*) from user.addresses)>1";
Iterator it3 = session2.createQuery(hql3).list().iterator();
while (it3.hasNext()) {
User user = (User) it3.next();
System.out.println(user.getId() + " " + user.getName());
}
session2.close();
// hibernate 也提供sql查詢方式(有問題?)
Session session3 = sessionFactory.openSession();
Transaction tr3 = session3.beginTransaction();
String sql = "select {user.*} from User as user";
Iterator it4 = session3.createSQLQuery(sql).list().iterator();
while (it4.hasNext()) {
User user = (User) it4.next();
System.out.println(user.getId() + " " + user.getName());
}
}
} Gavin