为什么HibernateTemplate中的findXXX()方法返回非参数化List?

Ale*_*exR 3 java generics spring hibernate

Spring 3.0增加了很多兼容java 5的功能.现在许多方法都是参数化的.例如HibernateTemplate.executeXXX(),HibernateTemplate.getXXX(),HibernateTemplate.mergeXXX()返回T, HibernateTemplate.loadAll()回报List<T>.

但是findXXX()方法很简单List,所以我必须把它转换成类似的东西List<MyEntity>.

有人知道是什么原因吗?为什么查找方法没有参数化?或者可能还有其他的参数化API?

这就是我在做什么.

这是spring.xml的相关部分:

  <bean id="hibernateInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor" autowire="byName" /><!--sessionFactory will get autowired-->

  <bean id="deviceDaoTarget" class="com.nso.solution.dao.DeviceDAOHibernateImpl" autowire="byName" /><!--sessionFactory will get autowired-->

  <bean id="discoveryDAO" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
      <value>com.nso.solution.dao.DeviceDAO</value>
    </property>
    <property name="interceptorNames">
      <list>
        <value>hibernateInterceptor</value>
        <value>deviceDaoTarget</value>
      </list>
    </property>
  </bean>
Run Code Online (Sandbox Code Playgroud)

DeviceDAO是一个接口,包含几个允许检索,保存和删除对象的方法.DeviceDAOHibernateImpl实现此接口,例如

public List<Device> getAllDevices() {
    return getHibernateTemplate().loadAll(Device.class);
}
Run Code Online (Sandbox Code Playgroud)

我必须使用@SuppressWarnings("unchecked")注释来标记此方法.

Sea*_*oyd 5

Spring没有更新HibernateTemplate,因为它在Spring 3中已被弃用.(参见Classic Spring Usage:Hibernate)

Spring建议简单地使用Hibernate,它不会将应用程序代码绑定到Spring Framework.

基本上:注入一个SessionFactory,使用@Transactional并执行简单的hibernate编码,而Spring自动创建和提交事务:

@Transactional
public class ProductDaoImpl implements ProductDao {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @SuppressWarnings("unchecked")
    public Collection<Product> loadProductsByCategory(String category) {
        return this.sessionFactory.getCurrentSession()
                .createQuery(
                    "from test.Product product where product.category=?")
                .setParameter(0, category)
                .list();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:这是Spring的示例代码,而不是我的代码,但我将其更改为返回通用集合.不需要铸造.(但你必须自己强制执行类型安全,编译器无法帮助你)