getHibernateTemplate().find()的java.lang.ClassCastException异常和传多个不同类型的参数

本文针对Java编程中使用HQL查询出现的ClassCastException异常进行了详细分析,并提供了两种常见场景下的解决方案,包括如何确保参数类型一致性和正确处理多类型参数。
一:异常
报这种异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer


API的方法:
public List find(String queryString,
Object[] values)
throws DataAccessException


类型出错!
可能:
(1)你的HQl参数先传的是什么类型的,就必须是什么类型的!就是fine()里面的第一个参数的类型跟HQL第一个问号的类型匹配。
(2)其它地方类型不一样!

二:传多个不一样的类型参数

public List<Upload> queryUploadByTidAndCid(String tname,int tid) {
return this.getHibernateTemplate().find("from Teacher where tname=? and tid=?",new Object[]{tname,tid});
}
你提到的代码: ```java this.getHibernateTemplate().find(sql); ``` 是 **Spring 与 Hibernate 3 及以下版本**中使用 `HibernateTemplate` 的方式,这种方式在 **Spring 3.0 后已经被废弃(deprecated)**,并且现代项目推荐使用基于 `SessionFactory` 或 `JPA EntityManager` 的方式。 --- ## ✅ 修改目标 将旧版的 `HibernateTemplate.find(sql)` 替换为现代 Spring + Hibernate 的写法。 --- ## ✅ 正确修改方式(基于 Hibernate + SessionFactory) ### ✅ 示例:使用 `SessionFactory` 查询 HQL 假设你已经注入了 `SessionFactory`: ```java @Autowired private SessionFactory sessionFactory; ``` 你可以这样重写查询逻辑: ```java public List<PayMes> findWithHql(String sql) { Session session = sessionFactory.getCurrentSession(); Query<PayMes> query = session.createQuery(sql, PayMes.class); return query.list(); } ``` ### 📌 示例调用: ```java String hql = "FROM PayMes WHERE someField = :value"; List<PayMes> result = findWithHql(hql) .setParameter("value", "test") .list(); ``` --- ## ✅ 如果你想入原生 SQL 查询 如果你原本的 SQL 是原生 SQL 而不是 HQL,应该使用 `createNativeQuery()`: ```java public List<PayMes> findWithNativeSql(String sql) { Session session = sessionFactory.getCurrentSession(); return session.createNativeQuery(sql, PayMes.class).getResultList(); } ``` > ⚠️ 注意:使用原生 SQL 时必须指定返回类型 `.addEntity(PayMes.class)` 或直接使用 `.createNativeQuery(sql, PayMes.class)`。 --- ## ✅ 使用泛型封装方法(可选) 如果你想更通用一点,可以封装一个通用方法: ```java public <T> List<T> executeQuery(String queryString, Class<T> resultClass) { Session session = sessionFactory.getCurrentSession(); Query<T> query = session.createQuery(queryString, resultClass); return query.list(); } ``` 调用示例: ```java List<PayMes> results = executeQuery("FROM PayMes WHERE id = 1", PayMes.class); ``` --- ## ✅ 补充说明:为什么 `HibernateTemplate` 被弃用? | 特性 | HibernateTemplate | 原生 SessionFactory / JPA | |------|-------------------|----------------------------| | 管理事务 | 自动管理 | 手动或通过注解管理 | | 异常转换 | 提供封装异常 | 需要 @Repository 注解支持异常翻译 | | 编码风格 | 模板回调风格 | 更加灵活、面向对象 | | 推荐程度 | 已废弃 | 推荐使用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值