所以 - 我一般都是hiberate和Java的新手。我已经看到了关于这个错误的几个线程,但似乎没有一个适合我的情况。我有一个简单的JPQL查询,如下所示,它应该从Function表/实体返回函数ID和名称。此查询保存在我的FunctionRepository.java
中@Query("SELECT func.functionId, func.functionName"
+ " FROM Function func")
List<Function> findItAll();
-----below is my FunctionService.java-------
public ArrayNode getAllFunctions() {
ArrayNode json = null;
try {
List<Function> functions = (List<Function>) functionRepository.findItAll();
json = crudEntitiesToJson(functions);
} catch (CorruptDataException cdEx) {
logger.error(cdEx.getMessage());
}
return json;
}
&#34; crudEntitiesToJson&#34;方法如下;
private ArrayNode crudEntitiesToJson(Iterable<Function> entities) throws CorruptDataException {
ArrayNode result = new ArrayNode(JsonNodeFactory.instance);
for (Function entity : entities) {
result.add(FunctiontoJson(entity));
}
return result;
}
所有这些都是由我的FunctionController.java
启动的项目构建并运行正常,但是当我尝试点击启动该查询的端点时,我收到以下错误:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.ge.starfish.entity.Function
我想我错了哪里出错。
提前致谢。
答案 0 :(得分:1)
更改
@Query("SELECT func FROM Function func")
List<Function> findItAll();
检索所有函数而不是具有两个属性的数组。它也会起作用:
@Query("FROM Function")
List<Function> findItAll();
答案 1 :(得分:0)
您只选择实体的两个字段:
func.functionId, func.functionName
这意味着,查询将返回一个对象数组列表,每个对象数组都有两个元素,然后您尝试将这些元素转换为Function对象列表。这不起作用。在其间添加映射步骤或在查询中选择整个实体。
答案 2 :(得分:0)
选择单个列时,您不会获得类型(在您的情况下为函数),而是一个对象数组,例如:Object[]
。
请尝试:List<Object[]> findItAll();
或者如果提取所有列都没问题,你可以像Doleron的答案那样做。
答案 3 :(得分:0)
在JPQL中,SELECT子句定义了要从数据库中检索的对象类型。您应该查询整个对象,而不是查询字段:
SELECT func FROM Function func
您可以在The Java EE 6 Tutorial找到更多信息和示例。