报错:
jpa [Ljava.lang.Object; cannot be cast to ‘XXX’
原因:
Service层所返回的数据类型与Repository层定义的抽象方法返回类型不一致所导致。
解决方法:
这里先提一下网络其他人的做法,此逻辑应该没问题,但本人并没有成功运行,仍然发生错误。
我们知道JPA每个Repository层所对应唯一一张数据表(实体类,对应规则为泛型参数),也就是说,无论CRUD哪种操作,要么返回int或无返回,要么就返回List<实体Bean>
这种形式。而返回List<实体Bean>
这种形式是依据实体类和泛型参数由JPA自动序列化的,那么我们能不能根据已有的规则直接使某个自定义抽象方法直接返回List
这种数据类型,然后再手动解析数据填充到Controller层?答案是可以的,只不过我的尝试是前者可以,后者不可以。
假设采用直接返回List
这种数据类型其格式大致如下:
[["mary","10"],["lucy","12"]]
而我们想要的数据类型(泛型集合序列化为JSON)大致如下:
[{"name":"mary","age":"10"},{"name":"lucy","age":"12"}]
仔细一看下面比上面似乎多了花括号及键,当然这都无所谓,只不过上面一个不规范而已。那么可以将上面的显示解析为下面:
for(int i = 0; i < list.size(); i++){
XXBean bean = (XXBean) list.get(i)
newList.add(bean);
}
还看到了这样的写法,原文大意为里面存放的是Object类型,所以需要使用数组:
if (list != null) {
for(int i = 0; i < list.size(); i++){
Object[] object = (Object[]) list.get(i);
textA = object[0].toString();
textB = object[1].toString();
}
}
但遗憾的是,这两种方法均不行。
那么,有没有一种简便方法来解决该问题?答案也是有的,而且十分简单。
假设Repository层所对应的Bean字段属性有5个,分别为id,性别,年龄,姓名,住址。但现在某个Controller只需返回年龄,姓名。那么在某个Controller里面将泛型集合的泛型参数定义为只有年龄和姓名的bean即可,然后只使用Repository层所对应的Bean的getAge()
及getName()
方法填入新建的bean中。这样就省略了每个实体类所必须对应的数据表了。