【问题标题】:Typed method in JpaRepository not returning correct typeJpaRepository 中的类型化方法未返回正确的类型
【发布时间】:2017-04-10 06:00:01
【问题描述】:

我在 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 ... 

当我调试时,这是我看到的:

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

【问题讨论】:

  • 您能否粘贴完整的本机查询(或至少粘贴选择部分)。似乎 jpa/spring-data 无法解析查询的返回类型,默认返回 Object[]

标签: java hibernate spring-data-jpa


【解决方案1】:

您需要使用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")}
)

【讨论】:

  • 能否请您通过有关 EntityManager 的解释来扩展答案?一些用户可能会在当前状态下阅读答案感到困惑。
【解决方案2】:

您的类型化实体查找方法必须与存储库类型匹配。在这里,您将存储库实体声明为SomeOtherEntity,但您的查找方法getThings 正在返回(列表)SomeEntity

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多