我想在orm.xml文件中爲JPA的所有命名查詢進行外部化。我想在我的Java程序中獲取命名的查詢字符串,以便進行某些操作,但JPA似乎沒有公開任何以字符串形式返回命名查詢的方法。我所能做的就是createNamedQuery
,它帶有指定查詢的名稱。獲取JPA中指定的查詢字符串
是否有任何其他解決此問題的方法來獲取像Hibernate這樣的命名查詢字符串?類似於JPA中的getSession().getNamedQuery("namedQueryName");
?
謝謝, Sonu。
我想在orm.xml文件中爲JPA的所有命名查詢進行外部化。我想在我的Java程序中獲取命名的查詢字符串,以便進行某些操作,但JPA似乎沒有公開任何以字符串形式返回命名查詢的方法。我所能做的就是createNamedQuery
,它帶有指定查詢的名稱。獲取JPA中指定的查詢字符串
是否有任何其他解決此問題的方法來獲取像Hibernate這樣的命名查詢字符串?類似於JPA中的getSession().getNamedQuery("namedQueryName");
?
謝謝, Sonu。
如果你確實需要,可以隨時通過JPA訪問特定供應商類(含unwrap()
在JPA 2.0,或者與以前的版本向下轉換):
String s = em.createNamedQuery("...")
.unwrap(org.hibernate.Query.class)
.getQueryString();
謝謝,正是我在找的東西。我也試圖找到一種替代方法。 Session session = ((Session) entityManager.getDelegate()); String query = session.getNamedQuery('NamedQueryName');
–
Prashanth
2011-04-18 16:22:28
完美的解決方案!謝謝! – 2015-04-24 12:23:15
哦,你可以用內省得到命名查詢註釋如:
String getNamedQueryCode(Class<? extends Object> clazz, String namedQueryKey) {
NamedQueries namedQueriesAnnotation = clazz.getAnnotation(NamedQueries.class);
NamedQuery[] namedQueryAnnotations = namedQueriesAnnotation.value();
String code = null;
for (NamedQuery namedQuery : namedQueryAnnotations) {
if (namedQuery.name().equals(namedQueryKey)) {
code = namedQuery.query();
break;
}
}
if (code == null) {
if (clazz.getSuperclass().getAnnotation(MappedSuperclass.class) != null) {
code = getNamedQueryCode(clazz.getSuperclass(), namedQueryKey);
}
}
//if not found
return code;
}
什麼樣的「操作目的」?我看不到一個令人信服的理由來外化字符串,然後操作它,而不是將名稱傳遞給'createNamedQuery()'。將字符串外部化是不是將Java代碼與JPQL分離開來的關鍵點?如果你想解耦邏輯,對它進行字符串操作聽起來就像是一種代碼異味。 – 2011-04-18 15:16:10