代码之家  ›  专栏  ›  技术社区  ›  AlexR

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

  •  3
  • AlexR  · 技术社区  · 15 年前

    Spring 3增加了许多与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>
    

    Devicedao是一个包含多个方法的接口,这些方法允许检索、保存和删除对象。devicedaoHibernateImpl实现此接口,例如

    public List<Device> getAllDevices() {
        return getHibernateTemplate().loadAll(Device.class);
    }
    

    我必须用@suppresswarnings(“unchecked”)注释标记此方法。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Sean Patrick Floyd    15 年前

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

    Spring suggests a simpler usage of Hibernate ,这不会将应用程序代码绑定到Spring框架。

    基本上:注入 SessionFactory 使用 @Transactional 在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();
        }
    }
    

    更新: 这是Spring的示例代码,不是我的,但我更改了它以返回通用集合。无需铸造。(但是你必须自己强制类型安全,编译器帮不了你)

        2
  •  0
  •   Michael Pralow    15 年前

    我将使用上面的会话工厂示例,并将其扩展到

        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();
    }
    

    如果你想要所有的行,就不用标准来使用它。

        3
  •  0
  •   Henryk Konsek    15 年前

    问题是Hibernate的家伙不想在HibernateAPI中使用泛型。据我所知,他们的论点是,他们不想强迫Java 1.4人切换到1.5。 HibernateTemplate 不会将搜索结果转换为参数化类型以保持与原始(非通用)Hibernate API的一致性。