2011-06-08 467 views
11

我可以知道如何從JPA查詢獲取sql嗎?或者說,將JPA查詢轉換爲SQL字符串?非常感謝你!我可以從JPA查詢對象獲取SQL字符串嗎?

+0

你能更清楚地瞭解你想要的東西嗎?即請發佈「JPA查詢」(標準查詢?JPQL?),並且可能是您期望的輸出類型的示例。另請告訴我們,您使用的JPA實現(OpenJPA,Hibernate等) – 2011-06-08 09:23:32

+0

對於hibernate實現:query.unwrap(org.hibernate.Query.class).getQueryString()。 – 2017-09-13 06:10:13

回答

6

如果你只是想知道你的JPQL或條件查詢如何被翻譯成你的數據庫的SQL方言,你可以啓用持久性XML細粒度的日誌記錄,然後看看你的日誌文件。

屬性名稱和值取決於您的JPA實現。這裏是的persistence.xml爲EclipseLink的相關部分的一個例子:

<properties> 
    <property name="eclipselink.logging.level" value="FINEST"/> 
</properties> 
2

您可能感興趣的是,如果有一種方法可以從javax.persistence.Query中提取JPQL字符串(包含params的佔位符或params填充後的最終JPQL)(可能的子類之一是更精確), - 在這種情況下根據JPA規範合同是不可能的。然而,假設這可能是通過JPA實現的(例如,NamedQueryImpl可能具有#toJPQLString(),您可以通過投射來訪問它),但是我對此抱有懷疑。 即使有可能我不認爲這是一個很好的代碼來執行這樣的操作。我會建議找到另一個設計解決方案(並且你可以指定你有什麼樣的實際問題)。例如,如果您要動態構建查詢,則可以使用JPA Criteria API,並且可以使用「構建」JPA查詢來維護反映查詢邏輯的內部數據結構。

3

除了能夠像@馬特方便的日誌中提到,也可以得到與在運行時的EclipseLink特定查詢的SQL字符串如here所述。

1

使用Hibernate作爲供應商,您可以啓用以下屬性:

hibernate.show_sql 

所有SQL語句到控制檯。這是設置日誌類別org.hibernate.SQL進行調試的替代方法。 (例如true | false)

hibernate.format_sql 

漂亮地打印日誌和控制檯中的SQL。 (例如:true |假)

或者,你上面的說明可以啓用日誌記錄到調試級別爲記錄器

org.hibernate.SQL 

日誌中的所有SQL DML語句執行時爲它們

8

對於的EclipseLink:您可以提取SQL方式如下:

query.unwrap(EJBQueryImpl.class).getDatabaseQuery().getSQLString() 

僅當之後查詢已執行。

+1

爲我工作,但我的項目沒有EJBQueryImpl.class(我用String rtn = query.unwrap(org.hibernate.Query.class).getQueryString();) – John 2016-10-26 14:22:39

2

繼卡羅爾的答案 - 這是可能的EclipseLink的執行語句之前檢索SQL:

Session session = em.unwrap(JpaEntityManager.class).getActiveSession(); 
DatabaseQuery databaseQuery = query.unwrap(EJBQueryImpl.class).getDatabaseQuery(); 
databaseQuery.prepareCall(session, new DatabaseRecord()); 
Record r = databaseQuery.getTranslationRow(); 
String bound = databaseQuery.getTranslatedSQLString(session, r); 
String sqlString = databaseQuery.getSQLString(); 

要檢索的SQL字符串在/執行後,它可能是最好的,而不是這樣做的使用持久性代碼:

<property name="eclipselink.logging.parameters" value="true"/> 
<property name="eclipselink.logging.level" value="FINE"/> 
相關問題