[英]Left join with <> condition (not equal to) returns wrong rows
HQL 語句:
String hql = "SELECT DISTINCT track FROM TrackEntity track " +
"LEFT JOIN track.releaseRelations releaseRelation " +
"LEFT JOIN releaseRelation.release.publisherProducerArtists releaseArtist " +
"LEFT JOIN releaseArtist.person releaseArtistPerson " +
"LEFT JOIN releaseRelation.release.publisherProducerGroupCasts releaseGroupCast " +
"LEFT JOIN releaseGroupCast.artistRelations releaseGroupCastArtistRelations " +
"LEFT JOIN releaseGroupCastArtistRelations.artist.person releaseGroupCastPerson " +
"WHERE (releaseArtistPerson.id <> " + personId +
" OR releaseArtistPerson.id IS null) " +
"AND (releaseGroupCastPerson.id <> " + personId +
" OR releaseGroupCastPerson.id IS null ) "
目標是找到與此人無關的所有軌道。 所以這個人不應該在publisherProducerArtists 和publisherProducerGroupCasts 中。
WHERE 語句只過濾掉 personId 相等的一行。 但是如果一行相等,則該軌道的所有行都應該被過濾掉。 可能我需要類似 NOT IN 的東西? 但是我必須使用 SUBSELECTs 對嗎?
解決這個問題的常用方法是什么?
感謝幫助 :)
需要理解以下語句:
(releaseArtistPerson.id <> " + personId + " OR releaseArtistPerson.id IS null)
當 Persion 的 Id 不等於給定的 Number/String 作為 PersionID 時,第一個表達式(與 OR 運算符連接的復合表達式)將返回 true,這也意味着如果 Persion 的 Id 為 Null,則該記錄也被選中。
因此,首先需要刪除使用 IS Null 檢查的 OR 部分。
如果問題仍然存在,請嘗試與 HQL 一起使用的 Not In 運算符,例如:
HQL:
from Person p where p.name not in (:nameList)
where,
List<String> nameList = new ArrayList<>();
nameList.add("abc");
nameList.add("def");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.