隨筆-42  評(píng)論-578  文章-1  trackbacks-0

          群里有朋友求解一個(gè)問題,高分求一條HQL多對(duì)多查詢語句 。

          問題描述見 http://topic.csdn.net/u/20090621/16/4eac6fe0-bf3e-422e-a697-f7584732f66e.html,摘要如下:

          一個(gè)學(xué)科表(Field),一個(gè)用戶表(User),多對(duì)多關(guān)系。 
          學(xué)科表有兩個(gè)字段,id和descripiton,用戶表有眾多字段,不羅列了 
          Field中有SET集合users 
          User中有SET集合fields 
          現(xiàn)在要查掌握id like '
          520%'的女性用戶 
          我這樣寫的: 
          from User u
          ,Field f where u.gender='m' in (select f.users from Field where f.id like '520%') 
          持續(xù)報(bào)錯(cuò)! 


          我的項(xiàng)目代碼中恰好有一個(gè)多對(duì)多的關(guān)聯(lián)映射的類:User(用戶)和Role(角色),其中,User類中有roles集合,而Role類中有users集合。我用我的代碼測(cè)試了一番。

          首先寫了下面這句:

          select user from User user where user.sex='男' and user in (select role.users from Role role where role.id>5)

          這樣不行,報(bào)錯(cuò)。原因是,Hibernate的HQL語句中的“in條件”句如:x  in(‘a’,’b’,’c’),要求的是x是(‘a’,’b’,’c’)中的一個(gè)元素,而select role.users這樣查出來的是集合的集合,它內(nèi)部的元素應(yīng)該是一個(gè)集合:set<user> in (select role.users…),而不是一個(gè)對(duì)象: user in (select role.users…)。

          可惜的是HQL語句沒有set<user> in (select role.users….)這樣的子句,后來,查了一下Hibernate的參考文檔,得到解決方法。原來,Hibernate的HQL語句中的“in條件”中,可加入”elements”關(guān)鍵詞,即上面的查詢語句變成:

          select user from User user,Role role where user.sex='男' and user in elements(role.users) and role.id>5

          這樣就行了。

          不過還有一個(gè)小問題,就是這樣查詢出來,會(huì)出現(xiàn)許多重復(fù)記錄,原因是查詢出的每一個(gè)符合的role后,會(huì)通過role.getUsers()查出users集合,這樣,當(dāng)然就可能出現(xiàn)有幾個(gè)role擁有相同的user的現(xiàn)象。很容易解決,加多一個(gè)“distinct ”關(guān)鍵詞就行。

          select distinct  user from User user,Role role where user.sex='男' and user in elements(role.users) and role.id>5

          好了,解決了。那位CSDN中的朋友提的問題也解決了,它的hql語句如下:

          select distinct u from User u,Field f where u.gender='m' and u in elements(f.users) and f.id like '520%'



          本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處,謝謝!http://www.aygfsteel.com/rongxh7(心夢(mèng)帆影JavaEE技術(shù)博客)
              

          posted on 2009-06-21 20:11 心夢(mèng)帆影 閱讀(12098) 評(píng)論(4)  編輯  收藏 所屬分類: Hibernate

          評(píng)論:
          # re: Hibernate多對(duì)多關(guān)聯(lián)映射的HQL中的in條件查詢問題 2009-06-22 15:28 | 123
          select USER_ROLE_TABLE ur where ur.user.sex='女' and ur.role.id like
          '520%'  回復(fù)  更多評(píng)論
            
          # re: Hibernate多對(duì)多關(guān)聯(lián)映射的HQL中的in條件查詢問題 2009-06-23 10:10 | 找個(gè)美女做老婆
          Java樂園交流學(xué)習(xí)社區(qū): http://www.javaly.cn

          QQ群:28840096  回復(fù)  更多評(píng)論
            
          # re: Hibernate多對(duì)多關(guān)聯(lián)映射的HQL中的in條件查詢問題 2009-07-04 16:03 | dikar
          select distinct user
          from (
          select user
          from User user
          where user.sex='男'
          ) tempUser , Role role
          where role.id>5
          and tempUser.id=role.user.id

          其實(shí)一般情況下的in最好用臨時(shí)表的思想替換掉 ,然后連接的字段最好是有索引的  回復(fù)  更多評(píng)論
            
          # re: Hibernate多對(duì)多關(guān)聯(lián)映射的HQL中的in條件查詢問題 2014-01-07 14:41 | 瀏覽
          這篇文章幫了大忙,謝謝  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 仁化县| 莲花县| 德江县| 西青区| 藁城市| 临清市| 莒南县| 宁蒗| 东明县| 稻城县| 双柏县| 屯门区| 陇南市| 梅河口市| 潍坊市| 霍山县| 淮北市| 石楼县| 保山市| 通海县| 邹城市| 林口县| 台南县| 鹿邑县| 沿河| 蓬安县| 康平县| 紫阳县| 卢氏县| 皋兰县| 鄂托克前旗| 阿拉善盟| 江口县| 长治县| 麻城市| 富民县| 双城市| 武夷山市| 六枝特区| 昌都县| 赫章县|