2012-10-16 66 views
1

我与JPA API(休眠支持)工作,并具有下列代码返回通用对象(如列表):清洁解决方案,在Java中

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<?>除了对特定对象列表进行类型转换吗?

回答

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 
} 
3

什么是你的SQL语句的性质是什么?作为

@NamedNativeQuery( 
    name="sql_name", 
    query="SELECT * " + 
      "FROM foo_table t " + 
      "WHERE t.foo_field = ? ", 
    resultClass=fooEntityClass.class 
) 
0

在这里,你不

public <T> List<T> getGenericListing(Class<T> clazz) { 
    //Other logic comes before... 
    TypedQuery<T> qry = entityManager.createNamedQuery(sql, clazz); 
    return qry.getResultList(); 
} 

其中“SQL”是NamedNativeQuery的名称,例如宣称:如果动态查询功能,不需要你,那么你可以使用此解决方案需要转换结果,而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> 
相关问题