3

我正在使用 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<?>除了针对特定对象列表进行类型转换之外,有没有更好的方法来返回它?

4

3 回答 3

6

您可以将演员表放入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
}
于 2012-10-16T07:23:31.610 回答
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 
) 
于 2012-10-16T08:04:33.103 回答
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>
于 2016-05-19T10:11:28.690 回答