in 條件子查詢的正確寫法某開發者在 CSDN 求助:存在 Field(學科)與 User(用戶)的多對多關聯,Field 包含 Set<User> users,User 包含 Set<Field> fields。需求:查詢掌握 ID 以 520% 開頭的學科的女性用戶。
錯誤嘗試:
from User u, Field f where u.gender='m' in (select f.users from Field where f.id like '520%')
HQL 的 in 子句要求左側為單個元素,右側為元素集合。但 select f.users 返回的是集合的集合(Set<Set<User>>),而非單個 User 集合。因此類型不匹配導致報錯。
elements 關鍵字HQL 提供 elements 關鍵字,將集合屬性展開為元素流:
select distinct u from User u, Field f
where u.gender='m'
and u in elements(f.users)
and f.id like '520%'
作者使用項目中 User-Role 多對多模型驗證:
user in (select role.users from Role ...) 失敗,同樣原因elements 後成功:user in elements(role.users)distinct 去重:多個 Role 可能關聯同一 User,避免重複記錄select distinct user from User user, Role role
where user.sex='男'
and user in elements(role.users)
and role.id > 5
in 子句左側必須是單一實體,右側必須是實體集合(而非集合的集合)elements(collection) 將集合屬性「扁平化」為元素序列distinct 為必備優化