JPA查询返回List<String[]>时抛出ClassCastException异常的解决方法
错误根因
JPQL查询多个独立字段时,JPA默认将每一行结果封装为Object[]数组,数组下标与SELECT语句中声明的字段顺序一一对应。
Repository方法上声明的List<String[]>属于编译期泛型声明,Java泛型存在运行时擦除机制,实际查询返回的列表元素类型为Object[],因此执行branchList.get(0)尝试将Object[]强转为String[]时,会抛出java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;异常。
可行解决方案
方案1:手动转换数组类型(改动量最小)
直接修改接收集合的泛型为Object[],读取数据时手动组装为目标String数组即可:
// 调整集合泛型为实际返回的Object[]类型 List<Object[]> branchList= repoFactory.getBranchRepo().searchByBranchCodeorNameLike(branchSearchCriteria, Boolean.TRUE); Object[] rawResult = branchList.get(0); // 手动转换为String数组 String[] t = new String[]{(String) rawResult[0], (String) rawResult[1]}; // 后续可直接通过下标取值 String branchName = t[0]; String branchCode = t[1];
方案2:使用JPA接口投影接收结果(可维护性更高)
通过JPA的接口投影特性直接返回结构化对象,避免数组下标取值和手动强转,代码可维护性更好:
- 定义投影接口,接口方法名与查询返回的字段名对应:
public interface BranchBaseInfo { String getBranchName(); String getBranchCode(); }
- 修改Repository方法的返回类型,同时给SELECT语句中的字段添加别名,与投影接口的方法名匹配:
@Query("SELECT distinct b.branchName as branchName, b.branchCode as branchCode FROM Branch b WHERE (b.branchName like %:branchSearchName% OR b.branchCode like %:branchSearchName%) AND b.active=:active") List<BranchBaseInfo> searchByBranchCodeorNameLike(@Param("branchSearchName") String branchSearchName, @Param("active") Boolean active);
- 业务代码中直接调用投影接口的getter方法取值,无需类型转换:
List<BranchBaseInfo> branchList= repoFactory.getBranchRepo().searchByBranchCodeorNameLike(branchSearchCriteria, Boolean.TRUE); BranchBaseInfo firstBranch = branchList.get(0); String branchName = firstBranch.getBranchName(); String branchCode = firstBranch.getBranchCode();
内容的提问来源于stack exchange,提问作者Rahul SK
相关产品推荐
相关产品推荐

