2009-10-08 50 views
3

我正在嘗試在同一查詢中混合使用HQL和SQl。喜歡用在同一查詢中混合使用HQL和SQL

「從對象A OBJ,表-B TBL其中obj.someProp = tbl.COLUMN」

,因爲我的客戶將需要修改查詢,學習HQL或映射未映射表是出了問題:(

如果不是冬眠,不會有人知道另一個ORM工具,它可以接受嗎?另一個JPA實現,或者JDO?

我試過這個,當然這是行不通的。這是有道理的我也是:結果沒有映射到對象,所以沒有任何編碼就沒有辦法獲得對象。我主要是在尋找原因這就是爲什麼這種方法不能很快奏效。

回答

10

這確實不起作用,我認爲它永遠不會,但不是因爲「沒有辦法獲得對象」。

休眠確實允許您使用plain SQL queries並提供了將結果映射到實體(或非實體Java對象)的許多不同選項。你可以寫你的查詢爲:

SELECT table_A.* 
    FROM table_A JOIN table_B on table_A.some_prop_column = tableB.other_column 
WHERE ... 

,並從休眠通過執行:

List objectAs = session.createSQLQuery(yourQuerySQL).addEntity(ObjectA.class).list(); 

的問題混合 SQL和HQL是,它很容易進入它們之間的衝突 - 從HQL生成的SQL可能使用一個表別名,另一個原始SQL;生成的SQL可能包含表/聯接與原始SQL等發生衝突......

而且它的結束,一切讓你絕對沒有 - 它甚至不會幫助你的使用情況。如果你希望有人修改一個「混合」的HQL/SQL查詢,他們仍然需要知道這兩個 SQL和HQL - 至少在區分這兩者的必要級別。所有這一切說,如果您的最終用戶需要能夠自定義該查詢,也許您應該查看使用Criteria API爲了根據用戶的輸入生成您需要的查詢。讓最終用戶修改應用程序中的實際查詢是一個巨大的安全漏洞,除非您採取極端預防措施。

+0

哇 - 偉大的作品。 SQL和自動實體加載真的很酷且功能強大!我擔心必須映射所有HQL實體才能執行一些簡單的SQL連接來檢索一種類型的實體。順便說一句。使用JPA/Hibernate 4.3.7就像這樣簡單:'列表< DAO > daos = em.createNativeQuery(sql,myDaoClass).getResultList()' – 2015-09-09 13:29:08