2013-06-20 61 views
1

我有以下問題,這不包括在Hibernate documentation。或者我在那裏找不到答案。谷歌搜索並沒有給我的細節也。實體對象作爲HQL參數

如果我們使用Entity對象作爲參數並使用Query.setParameter將其綁定到HQL,接下來會發生什麼?

  • hibernate是否只使用映射參數對象的實體ID來構建SQL'where'查詢?
  • 或者Hibernate使用一些額外的邏輯(可能在某些情況下),它不僅限於ID?例如,hibernate在SQL中添加不是主鍵的附加字段。
  • 使用分離的實體對象作爲參數是危險的嗎?

預先感謝您!

+0

我覺得hibernate使用id的相關對象,但它可以是aplaid只有對象,它有命名屬性id,它會在sql中加入連接。當你通過它的id對象引用實體時,hibernate將不會使用join。此外,用作參數的對象必須附加到會話中。 –

+0

你認爲如果一個對象沒有附加到一個會話中,會拋出異常?它看起來像我們的應用程序中沒有發生異常,並且對象被分離。我不確定這是否正常,我不應該附加保存數據庫流量的對象。 – Sqeezer

+0

我不確定這一點,但如果它的工作,你可以使用它。但我認爲直接使用對象屬性來設置參數會更好。 object.anotherobject.id = comparatorobject.id –

回答

0

就SQL而言,它將簡單地使用ID進行比較。您綁定的實體不必在該會話中進行管理,因爲您的問題的評論暗示了這一點。

本質上發生的是,Hibernate將嘗試解析它給出的實體實例的實體類型。然後它將使用該類型來綁定JDBC參數值,該參數值將只寫入標識符。所以這裏的假設是實體實例可以解析爲它的「實體類型」。在大多數情況下,這通常很容易。在Hibernate特有的「實體名稱」功能的情況下,它變得困難。