自由飛翔

          我在仰望,java之上

          統計

          留言簿(2)

          我關注的blog

          閱讀排行榜

          評論排行榜

          hql如何解決聯合查詢了?

               最近在一次電話面試中,被問到這么個問題。
              文章參考: 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

          posted on 2011-08-08 00:21 GavinMiao 閱讀(1636) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 丰镇市| 盱眙县| 瑞昌市| 温泉县| 通海县| 惠州市| 常州市| 禹城市| 隆尧县| 冷水江市| 邢台县| 米泉市| 庄浪县| 嵩明县| 基隆市| 宁陕县| 赤城县| 望谟县| 紫阳县| 德庆县| 阿拉善右旗| 灵山县| 镇平县| 广饶县| 凌源市| 呈贡县| 安阳县| 大名县| 贵州省| 宿州市| 琼结县| 惠安县| 广南县| 乐亭县| 上饶县| 游戏| 辽阳县| 玉林市| 比如县| 铜川市| 和硕县|