簡體   English   中英

帶有 <> 條件(不等於)的左連接返回錯誤的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM