我正在使用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);
}
除了针对特定对象列表进行类型转换之外,还有更好的方法可以返回List<?>
吗?
答案 0 :(得分:5)
您可以将演员阵容放入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
}
答案 1 :(得分:3)
你的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
)
答案 2 :(得分:0)
这里您不需要转换结果,而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>
按照这种方法,您可以更改查询而无需编译我觉得有用的项目,摘自Finder.xml
<named-query name="Country.findCountryByShortNameAndLocale">
<query>
SELECT c FROM Country c WHERE c.Country.shortName = :shortName AND c.language.locale = :locale
</query>
</named-query>