【问题标题】:Spring Data JPA "Couldn't find PersistentEntity" for List<String> [duplicate]List <String>的Spring Data JPA“找不到PersistentEntity” [重复]
【发布时间】:2018-01-18 14:35:36
【问题描述】:

很难弄清楚我是在遇到错误还是在做一些愚蠢的事情......

Spring Boot v2.0.0.M7、spring-data-jpa、spring-data-rest、MySQL

以下@Query

@Query("select DISTINCT item.statusCode from Item item")
public List<String> lookupStatusCodes();

PagingAndSortingRepository 正在抛出一个

java.lang.IllegalArgumentException: Couldn't find PersistentEntity for type class java.lang.String!
at org.springframework.data.mapping.context.PersistentEntities.lambda$getRequiredPersistentEntity$2(PersistentEntities.java:78) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at java.util.Optional.orElseThrow(Unknown Source) ~[na:1.8.0_151]
at org.springframework.data.mapping.context.PersistentEntities.getRequiredPersistentEntity(PersistentEntities.java:77) ~[spring-data-commons-2.0.2.RELEASE.jar:2.0.2.RELEASE]
at org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.wrap(PersistentEntityResourceAssembler.java:72) ~[spring-data-rest-webmvc-3.0.2.RELEASE.jar:3.0.2.RELEASE]

statusCode 是一个 varchar,Item 本身可以像 @Entity 一样正常工作,但是尝试投影到字符串列表(或 List&lt;Object&gt;)会因上述原因而失败。

如果重要,我故意不想在这里返回Page&lt;String&gt;(不需要分页,因为预期的结果集很小)。

【问题讨论】:

  • 你无法获取 List 你只能从 Repository 获取 List
  • 我不相信这是真的 - Spring Data 示例包括从存储库查询返回投影
  • 没错。但是在您的问题或代码中,您没有提到与使用投影相关的任何内容。
  • 我没有使用预测 - 我只是说 Repos 不限于返回 T 类型(这就是我阅读您的评论的方式)。请参阅下面我的评论,虽然投影也不起作用
  • @jameygraham 你发现了什么吗?我在 Spring 2 之前使用过它,它正在工作。我不能让它工作了(同样的例外:找不到 PersistenceEntity ...)。我在 [最新版本的文档] [docs.spring.io/spring-data/data-commons/docs/2.2.x/reference/… 中找不到任何示例当我调试 Spring 数据存储库代码时,它看起来不能再工作了(它在 AbstractMappingContext 的“persistentEntities”中查找映射,但只有实体的存储库在那里)。也许已经不可能了?

标签: spring-boot spring-data-jpa


【解决方案1】:

字符串不能直接映射。您将需要一个映射器对象。创建一个带有字符串字段的模型类 -

package org.xyz.model;

import java.io.Serializable;

public class StringResult implements Serializable {

    private static final long serialVersionUID = 1L;
    private String result;

    public StringResult(
        String result) {
        super();
        this.result = result;
    }

    public String getResult() {
        return result;
    }
}

然后更改查询以使用模型类 -

@Query("select new org.xyz.model.StringResult(DISTINCT item.statusCode as result) from Item item")
public List<StringResult> lookupStatusCodes();

【讨论】:

  • 我理解您认为这会起作用的原因(我也认为它应该起作用),但它实际上会产生相同的错误(仅针对 Result 类 vs.细绳)。 应该实际上没有必要包装一个字符串。深入研究一下,看起来 Projections 也不起作用(同样的错误),所以我开始觉得我只是遇到了一个错误。
  • @jameygraham 你找到解决方案了吗? spring-boot 2.0.3,spring-data Lovelace-M3 具有相同的功能
  • @jameygraham github.com/spring-projects/spring-boot/issues/10312github.com/spring-projects/spring-data-commons/blob/master/src/… 是的,对于不可映射的实体来说这是一个例外,这些实体显然不应该包含字符串。自 2.0 以来,感觉就像 Spring Boot 中的一个错误(并且仍然存在,并且在最新版本中没有修复)。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多