2011-06-24 55 views
2

我是JPA 2.0/EclipseLink/Glassfish/JEE6的新手,並且有一個基本問題。在JPA 2.0當前事務中執行一些任意的sql

我有一個DAO,其中大多數實體直接映射到使用JPA批註的列,所以我使用EntityManager,它工作良好,沒有問題。

但是有一些表格我自己構建SQL語句,他們使用的是特定於oracle的函數(空間),我希望對SQL進行非常細緻的控制。所以我用字符串連接構建它。我希望能夠在當前事務中註冊我的SQL執行,如果有一個正在執行。

所以很自然,我不想直接進入DriverManager並創建自己的連接,我正在尋找某種EntityManager.executeArbitrarySQL(String)函數,該函數將查找當前連接並使我的SQL成爲當前交易。我擺脫我的搖桿嗎?

回答

6

可以使用EntityManager.createNativeQuery()方法在您正在使用的同一個EntityManager的上下文中執行本機SQL查詢。有三種不同類型的這些方法,它們在提供的參數上有所不同。

第一個,createNativeQuery(String sqlString, Class resultClass)期望您提供表示查詢將返回的值的類型的Class對象。如果您要返回一組可以映射到您的持久性單元中另一個實體定義類的值,則使用此值。第二個createNativeQuery(String sqlString, String resultSetMapping)期望您提供結果集映射的名稱。結果集映射應該使用@SqlResultSetMapping註釋來定義。

最後的createNativeQuery(String sqlString)顯然是用於沒有返回結果集的場景,例如執行INSERT,UPDATE和DELETE語句。

您也可以使用@NamedNativeQuery註釋或persistence.xml文件中的named-native-query元素定義本機查詢,但這些更適合於您在開發過程中瞭解查詢結構的情況。但是,您可以創建多個這種命名的本機查詢來表示您希望執行的所有類型的SQL語句,然後根據用戶輸入在運行時執行不同的語句。帶註釋的本地查詢使用EntityManager.createNamedQuery()方法執行。人們需要使用位置參數(使用?佔位符定義)在運行時爲本機查詢提供值。