簡體   English   中英

Hibernate 嵌套屬性條件

[英]Hibernate nested properties criteria

讓我們假設,每首歌曲都只屬於一個由居住在一個國家的藝術家創作的專輯。 像這樣的查詢

createCriteria(Song.class)
    .add(Restrictions.eq("album.artist.country.id", 43)); 

失敗,可以使用createAliascreateCriteria (如此)修復,以便執行所需的連接。 我正在這樣做並且它有效,但我缺少一些背景:

為什么它會這樣工作? 假設沒有嵌入屬性,加入是唯一的選擇,不是嗎?

關於連接類型,沒有歧義:它必須是內部連接,否則等式不成立,對吧?

關於為什么要以這種方式構建某些東西的問題總是很棘手,您可能需要直接詢問作者。

我找不到任何關於此的官方文檔,但我認為它與基於字符串的查詢 (HQL) 與基於對象的查詢(標准)有關。

無論如何,您編寫的查詢比 Criteria 更 HQL,那么為什么不為整個查詢使用 HQL?

我知道這只是您編寫的一個簡短示例來描述該概念,並且在更復雜的 Criteria 查詢中使用基於字符串的路徑導航連接可能也很方便,但 Criteria 的重點是提供更多類型安全的查詢和可重用的標准部分,您可以根據影響最終查詢外觀的各種其他條件,使用它們來分塊構建查詢。

例如,假設您為所有實體屬性預定義了常量,以便確保在使用基於字符串的查詢時不會出現任何拼寫錯誤:

public final class Album_ {
  public static final String artist = "artist";
}

public final class Artist_ {
  public static final String country = "country";
}

有一些工具/框架可以自動生成這些類。

因此,您可以通過以下方式生成 Criteria:

createCriteria(Song.class)
 .createCriteria(Album_.artist)
 .createCriteria(Artist_.country)
 ...

對於大多數查詢,上述方法是不必要的開銷,並且會降低代碼的可讀性,恕我直言(我個人認為 HQL/JPQL 更具可讀性,即使涉及StringBuilder或類似內容),但我認為這是 Criteria 背后的基本思想:更安全和更可重用的查詢部分。

關於連接類型,沒有歧義:它必須是內部連接,否則等式不成立,對吧?

您應該使用內部聯接。

為什么它會這樣工作?

因為hibernate會生成,所以你應該放別名。

你有沒有想過 Hibernate Native SQL 呢? 因為會對數據庫進行混亂的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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