Criteria查询类型转换警告:是否应使用@SuppressWarnings?
Hibernate Criteria查询类型转换警告问题解答
一、当前写法是否正确?
逻辑上能运行,但存在两个明显问题:
- 类型安全风险:
criteria.list()返回的是原始类型List,强制转成List<HealthEntity>属于未检查的类型转换——JVM在运行时无法验证列表内所有元素都是HealthEntity类型,如果查询结果混入其他类型对象,后续业务代码使用列表时会抛出ClassCastException。 - 逻辑瑕疵:你把
Restrictions.in条件添加的代码放在了if判断外面,当customerId为空时,这条空集合的in条件仍会被执行,可能返回所有HealthEntity数据,和else分支返回空列表的预期完全矛盾,应该把条件添加代码移到if块内部。
二、是否应该直接用@SuppressWarnings("unchecked")?
可以用,但不是最安全的选择:
- 如果能确定查询逻辑只会返回
HealthEntity(毕竟createCriteria(getPersistentClass())指定了目标实体类),添加@SuppressWarnings("unchecked")注解可以快速压制警告,不影响功能,是最省事的做法。 - 更稳妥的方式是手动做类型校验,提前暴露问题:
这样如果有非List<?> rawList = criteria.list(); List<HealthEntity> result = new ArrayList<>(rawList.size()); for (Object obj : rawList) { result.add(HealthEntity.class.cast(obj)); } return result;HealthEntity的元素,会立刻抛出异常,方便及时定位问题,而不是等到后续业务代码使用列表时才报错。 - 如果你用的是Hibernate 5.2及以上版本,建议直接使用泛型化的查询API(比如
CriteriaQuery),从根源上避免类型转换问题。
修正后的代码示例
public List<HealthEntity> findByCustomerIds(List<Long> customerId) { if (customerId == null || customerId.isEmpty()) { return new ArrayList<>(1); } Criteria criteria = getSession().createCriteria(getPersistentClass()); criteria.add(Restrictions.in("customerId", customerId)); // 方案1:手动类型校验(更安全) List<?> rawList = criteria.list(); List<HealthEntity> result = new ArrayList<>(rawList.size()); for (Object obj : rawList) { result.add(HealthEntity.class.cast(obj)); } return result; // 方案2:确定安全时用注解压制警告(更省事) // @SuppressWarnings("unchecked") // return (List<HealthEntity>) criteria.list(); }
内容的提问来源于stack exchange,提问作者Abhishikth
相关产品推荐
相关产品推荐

