![](/img/trans.png)
[英]Is there a way to mark (e.g. annotate) a Java method as never returning?
[英]Cleaner solution to returning generic objects (e.g. Lists) in Java
我正在使用JPA API(由Hibernate支持),並且具有以下代碼:
public List<?> getGenericListing(Class<?> clazz) {
//Other logic comes before...
Query qry = entityManager.createNativeQuery(sql, clazz);
return qry.getResultList(); //Returns an untyped list, part of JPA spec
}
public List<SpecificObject> getSpecificListing() {
return (List<SpecificObject>) getGenericListing(SpecificObject.class);
}
除了針對SpecificObject的列表進行類型轉換之外,還有沒有更好的方法來返回List<?>
?
您可以將演員表放入getGenericListing
:
public <T> List<T> getGenericListing(Class<T> clazz) {
//Other logic comes before...
Query qry = entityManager.createNativeQuery(sql, clazz);
return (List<T>) qry.getResultList(); //Returns an untyped list, part of JPA spec
}
你的sql的本質是什么? 如果您不需要動態查詢功能,則可以使用以下解決方案:
public <T> List<T> getGenericListing(Class<T> clazz) {
//Other logic comes before...
TypedQuery<T> qry = entityManager.createNamedQuery(sql, clazz);
return qry.getResultList();
}
其中“ sql”是NamedNativeQuery的名稱,例如聲明為
@NamedNativeQuery(
name="sql_name",
query="SELECT * " +
"FROM foo_table t " +
"WHERE t.foo_field = ? ",
resultClass=fooEntityClass.class
)
在這里,您不需要強制轉換結果,namedQueryName只是命名查詢的名稱。
public <T> List<T> getGenericListing(final String namedQueryName,Class<T> clazz) {
TypedQuery<T> qry = em.createNamedQuery(namedQueryName, clazz);
return qry.getResultList();
}
另外,我更喜歡使用xml而不是Java類中的字符串來存儲命名查詢-它更易於維護,因此我的persistence.xml具有:
<mapping-file>META-INF/Finders.xml</mapping-file>
按照這種方法,您可以在不編譯項目的情況下更改查詢,而我發現對項目沒有幫助。
<named-query name="Country.findCountryByShortNameAndLocale">
<query>
SELECT c FROM Country c WHERE c.Country.shortName = :shortName AND c.language.locale = :locale
</query>
</named-query>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.