java.lang.Object继承;不能转换为<hibernate entity =“”>

时间:2017-10-18 14:33:10

标签: java hibernate jpql

所以 - 我一般都是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

我想我错了哪里出错。

提前致谢。

4 个答案:

答案 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找到更多信息和示例。