List<String> 的 Spring Data JPA“找不到 PersistentEntity”

jam*_*ham 5 spring-data-jpa spring-boot

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

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();
Run Code Online (Sandbox Code Playgroud)

在 aPagingAndSortingRepository上扔 a

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]
Run Code Online (Sandbox Code Playgroud)

statusCode 是一个 varchar 并且Item它本身像 @Entity 一样按预期工作,但是尝试投影到一个字符串列表(或List<Object>)会因上述情况而失败。

如果重要的话,我故意不想在Page<String>此处返回 a (由于预期结果集很小,因此不需要分页)。

har*_*wal 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我理解你为什么认为这会起作用的原因(而且我也认为它_应该_起作用),但它实际上会产生相同的错误(仅针对 Result 类与 String )。实际上应该没有必要包装字符串。深入研究一下,看起来投影也不起作用(同样的错误),所以开始感觉我只是遇到了一个错误。 (2认同)