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

Java 为什么HibernateTemplate中的findXXX()方法返回非参数化列表?,java,hibernate,spring,generics,Java,Hibernate,Spring,Generics,Spring3.0添加了许多与Java5兼容的特性。现在很多方法都参数化了。 例如HibernateTemplate.executeXXX(),HibernateTemplate.getXXX(),HibernateTemplate.mergeXXX()返回T, HibernateTemplate.loadAll()返回List 但是findXXX()方法返回普通的List,因此我必须将其转换为类似List的内容 有人知道原因是什么吗?为什么查找方法没有参数化?或者可能还有其他参数化的API 这

Spring3.0添加了许多与Java5兼容的特性。现在很多方法都参数化了。 例如
HibernateTemplate.executeXXX()
HibernateTemplate.getXXX()
HibernateTemplate.mergeXXX()
返回T,
HibernateTemplate.loadAll()
返回
List

但是
findXXX()
方法返回普通的
List
,因此我必须将其转换为类似
List
的内容

有人知道原因是什么吗?为什么查找方法没有参数化?或者可能还有其他参数化的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>

com.nso.solution.dao.DeviceDAO
冬眠受体
设备目标
DeviceDAO是一个包含多个方法的接口,这些方法允许检索、保存和删除对象。DeviceDAOHibernateImpl实现这个接口,例如

public List<Device> getAllDevices() {
    return getHibernateTemplate().loadAll(Device.class);
}
公共列表getAllDevices(){ 返回getHibernateTemplate().loadAll(Device.class); }
我必须用@SuppressWarnings(“unchecked”)注释来标记这个方法。

Spring没有更新HibernateTemplate,因为它在Spring 3中被弃用。 (见附件)

,这不会将应用程序代码绑定到Spring框架

基本上:在Spring自动创建和提交事务时,插入一个
SessionFactory
,使用
@Transactional
并执行普通的hibernate编码:

@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();
    }
}
@Transactional
公共类ProductDaoImpl实现ProductDao{
私人会话工厂会话工厂;
public void setSessionFactory(SessionFactory SessionFactory){
this.sessionFactory=sessionFactory;
}
@抑制警告(“未选中”)
公共集合loadProductsByCategory(字符串类别){
返回此.sessionFactory.getCurrentSession()
.createQuery(
“来自test.Product,其中Product.category=?”)
.setParameter(0,类别)
.list();
}
}

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

我将使用上面的sessionfactory示例并将其扩展到

    public List<T> findByCriteria(Class<T> persistentClass, Criterion... criterion) {
    Criteria crit = getSessionFactory().getCurrentSession().createCriteria(persistentClass);
    for (Criterion c : criterion) {
        crit.add(c);
    }
    return crit.list();
}
公共列表findByCriteria(类persistentClass,criteria…criteria){
Criteria crit=getSessionFactory().getCurrentSession().createCriteria(persistentClass);
对于(标准c:标准){
标准增补(c);
}
返回crit.list();
}

如果您想要所有行,只需使用它而不使用标准。问题是Hibernate的人不想在HibernateAPI中使用泛型。据我所知,他们的论点是,他们不想强迫Java1.4用户切换到1.5
HibernateTemplate
不会将搜索结果转换为参数化类型,以便与原始(非通用)Hibernate API保持一致。

感谢您的回复。不幸的是,我不明白这对我有什么帮助。您的解决方案仍然返回纯集合。并处理较低级别的API。无论如何,感谢您发送的参考资料。我正在阅读文档,我希望我能很快理解该做什么。这不是我的解决方案,而是Spring的示例代码。不,它不处理低级api,Spring会自动创建、关闭和提交事务和会话,您只需调用getCurrentSession()