Java.lang.Object;无法转换为 <hibernate entity>
Java.lang.Object; cannot be cast to <hibernate entity>
所以 - 我是休眠新手,一般来说 Java。我已经看到几个关于此错误的线程,但 none 似乎适合我的情况。我有一个简单的 JPQL 查询,如下所示,它应该从函数 table/entity 返回函数 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;
}
"crudEntitiesToJson"方法如下;
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
我想我不知道哪里出错了。
提前致谢。
您只 selecting 您实体的两个字段:
func.functionId, func.functionName
这意味着,查询将 return 对象数组列表,每个对象数组有两个元素,然后您尝试将其转换为 Function 对象列表。那是行不通的。在查询中添加映射步骤或 select 整个实体。
选择单个列时,您不会获得类型(在您的情况下函数),而是一系列对象,例如:Object[]
。
所以尝试:List<Object[]> findItAll();
或者如果获取所有列都可以,你可以像 Doleron 的回答那样做。
更改
@Query("SELECT func FROM Function func")
List<Function> findItAll();
检索所有函数而不是具有两个属性的数组。它也可以工作:
@Query("FROM Function")
List<Function> findItAll();
在 JPQL 中,SELECT 子句定义了您要从数据库中检索的对象类型。您应该像这样查询整个对象,而不是查询字段:
SELECT func FROM Function func
您可以在 The Java EE 6 Tutorial 找到更多信息和示例。
所以 - 我是休眠新手,一般来说 Java。我已经看到几个关于此错误的线程,但 none 似乎适合我的情况。我有一个简单的 JPQL 查询,如下所示,它应该从函数 table/entity 返回函数 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;
}
"crudEntitiesToJson"方法如下;
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
我想我不知道哪里出错了。
提前致谢。
您只 selecting 您实体的两个字段:
func.functionId, func.functionName
这意味着,查询将 return 对象数组列表,每个对象数组有两个元素,然后您尝试将其转换为 Function 对象列表。那是行不通的。在查询中添加映射步骤或 select 整个实体。
选择单个列时,您不会获得类型(在您的情况下函数),而是一系列对象,例如:Object[]
。
所以尝试:List<Object[]> findItAll();
或者如果获取所有列都可以,你可以像 Doleron 的回答那样做。
更改
@Query("SELECT func FROM Function func")
List<Function> findItAll();
检索所有函数而不是具有两个属性的数组。它也可以工作:
@Query("FROM Function")
List<Function> findItAll();
在 JPQL 中,SELECT 子句定义了您要从数据库中检索的对象类型。您应该像这样查询整个对象,而不是查询字段:
SELECT func FROM Function func
您可以在 The Java EE 6 Tutorial 找到更多信息和示例。