JpaRepository中的类型化方法未返回正确的类型

时间:2016-11-25 20:06:49

标签: java hibernate spring-data-jpa

我在JpaRepository中有一个方法,它应该返回一个JPA实体列表:

@Entity
public class SomeEntity {
    // ...
}

@Repository
public interface SomeOtherEntityRepository extends JpaRepository<SomeOtherEntity, Long> {

    @Query(value = "select some big long native query", nativeQuery = true)
    public List<SomeEntity> getThings(String key);
}

执行此查询并尝试访问List中的条目时,我得到ClassCastException

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to my.package.SomeEntity
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at ... 

当我调试时,这就是我看到的:enter image description here

这似乎破坏了Java中的强类型变量。我不知道这是可能的。我可以更改我的代码以期望一个Object数组并将Object数组转换为实体,但这似乎是我不应该做的事情。

3 个答案:

答案 0 :(得分:0)

JPA似乎不支持为@Query指定结果类。您可以使用@NamedNativeQueryEntityManager.createNativeQuery来指定结果类。

请参阅http://www.thoughts-on-java.org/jpa-native-queries/

答案 1 :(得分:0)

您键入的实体查找方法必须与存储库类型匹配。在这里,您声明您的存储库实体为SomeOtherEntity,但您的查找方法getThings正在返回({1}}的列表。

答案 2 :(得分:0)

您需要使用SqlResultSetMapping。一个好的教程是:http://www.thoughts-on-java.org/result-set-mapping-basics/

示例代码:

Query q = em.createNativeQuery(
    "SELECT o.id AS order_id, " +
        "o.quantity AS order_quantity, " +
        "o.item AS order_item, " +
        "i.name AS item_name, " +
    "FROM Order o, Item i " +
    "WHERE (order_quantity > 25) AND (order_item = i.id)",
"OrderResults");

@SqlResultSetMapping(name="OrderResults", 
    entities={ 
        @EntityResult(entityClass=com.acme.Order.class, fields={
            @FieldResult(name="id", column="order_id"),
            @FieldResult(name="quantity", column="order_quantity"), 
            @FieldResult(name="item", column="order_item")})},
    columns={
        @ColumnResult(name="item_name")}
)