我目前正在嘗試構建一個 SQL(純 SQL,直接在資料庫上執行 - 我沒有特別為此使用休眠)來從我的資料庫中獲取資料。它是基于 Java 實作的(休眠)條件查詢的匯出,我想向其中添加來自附加表的附加資訊。
在 Java Criteria 查詢中,我有如下宣告:
Criteria criteria = session.createCriteria(MyEntity.class);
criteria.createCriteria("fk").add(Restrictions.in("sysid", <<someListofIDsfromPreviousQuery>>))
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return criteria.list();
從表 A(“someListofIDsFromPreviousQuery”)的 ID 串列中產生 1-1 結果集,表 B(“MyEntity.class”)中有多個結果。
我知道 DISTINCT_ROOT_ENTITY 是做什么的,但我想知道它實際上是如何作業的,意思是等效的 SQL 是什么樣的?
根據上述條件查詢的示例:
SELECT COUNT(*) FROM TABLEA a
WHERE a.property1=someValue AND a.property2=someOtherValue;
回傳 2000 個結果。(這是我的ID串列)
SELECT COUNT(*) FROM TABLEA a
JOIN TABLEB b ON b.fk = a.sysid -- <-- this is basically equivalent to what the criteria query above does, no?
WHERE a.property1=someValue AND a.property2=someOtherValue;
回傳 2500 個結果。
Critera.DISTINCT_ROOT_ENTITY 如何實際選擇 TABLEB 的哪個條目作為其“不同物體”?還是我在這里弄錯了?
如果它有所作為:我正在嘗試用 OracleDB SQL 方言撰寫我的查詢。
uj5u.com熱心網友回復:
經過一些搜索、試驗和通常的困惑 - 似乎 DISTINCT_ROOT_ENTITY 似乎沒有對如何確定表 B 中的值做出任何實際決策。它只是“隨機”從 JOIN 中獲取結果集的第一個值。
因此,我試圖作為 SQL 基礎的代碼對于它所在的應用程式來說實際上是錯誤和危險的。很高興知道。咳嗽
uj5u.com熱心網友回復:
我發現我們可以使用以下兩種不同的方式獲得不同的結果
Projections.distinct(Projections.property("id"));
這是預測結果與
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347724.html
上一篇:用戶創建的休眠識別符號問題
