自由飛翔

          我在仰望,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)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 马关县| 汉川市| 台山市| 凤山市| 九寨沟县| 西林县| 泰州市| 绥阳县| 饶平县| 高雄县| 安平县| 安仁县| 阿克苏市| 玉环县| 来宾市| 徐闻县| 临武县| 剑河县| 荔浦县| 渝北区| 安化县| 沭阳县| 吉木乃县| 广南县| 无棣县| 奉化市| 明星| 都江堰市| 长治市| 南木林县| 南昌市| 报价| 威海市| 文安县| 长葛市| 湘乡市| 米脂县| 贵德县| 秦皇岛市| 遂昌县| 崇义县|