程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Hibernate多對多關聯映射的HQL中的in條件查詢問題

Hibernate多對多關聯映射的HQL中的in條件查詢問題

編輯:關於JAVA

群裡有朋友求解一個問題,高分求一條HQL多對多查詢語句 。

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

一個學科表(Field),一個用戶表(User),多對多關系。

學科表有兩個字段,id和descripiton,用戶表有眾多字段,不羅列了

Field中有SET集合users

User中有SET集合fields

現在要查掌握id like '520%'的女性用戶

我這樣寫的:

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

持續報錯!

我的項目代碼中恰好有一個多對多的關聯映射的類:User(用戶)和Role(角色),其中,User類中有 roles集合,而Role類中有users集合。我用我的代碼測試了一番。

首先寫了下面這句:

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

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

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

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

這樣就行了。

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

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%'

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved