从本机查询返回单个投影

Posted

技术标签:

【中文标题】从本机查询返回单个投影【英文标题】:Returning a single projection from native query 【发布时间】:2020-04-15 23:53:31 【问题描述】:

我正在尝试从本机查询返回一个投影,而不是投影列表。我一直遇到转换器错误:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [PersonRepository$NameProjection]

我的 spring 版本相当旧(spring-boot-starter-data-jpa v1.5.3),但由于外部原因我无法升级它。所以我只是想知道我是否可以使用我拥有的版本。

我的存储库如下所示:

public PersonRepository extends JpaRepository<Person, Integer> 

    interface NameProjection 
        private String firstName;
        private String lastName;
    

    @Query(value = "SELECT first_name AS firstName, last_name AS lastName FROM person where person_id = :personId", nativeQuery = true)
    NameProjection getPersonNameById(@Param("personId") Integer personId);

    @Query(value = "SELECT first_name AS firstName, last_name AS lastName FROM person", nativeQuery = true)
    List<NameProjection> getPersonNames();

当我打电话给getPersonNameById() 时,我收到了上面的错误。有趣的是,如果我将投影更改为只有 1 个字段,例如firstName,则该方法有效。但是,只要有多个字段,就会出现上面的转换器错误。

调用getPersonNames() 的工作方式与我预期的完全一样,其中返回的投影列表包含我指定的字段。

如何更改我的存储库代码,以便 Spring 允许我返回单个投影?

提前谢谢你。

【问题讨论】:

【参考方案1】:

这可能是一个长期修复的错误:https://jira.spring.io/browse/DATAJPA-980 或一些相关问题,在该领域已经有一些。

如果您碰巧使用 EclipseLink,甚至还有问题:https://bugs.eclipse.org/bugs/show_bug.cgi?id=525319

因此,真正解决此问题的方法是升级您的版本。

如果这不可能,如您在问题中描述的那样,最好的主意是切换到自定义实现并直接使用 EntityManager 甚至只是 Jdbc Connection/JdbcTemplate

【讨论】:

啊,这个问题似乎准确地描述了我的问题!不幸的是,我正在从事的项目目前无法升级到更新的 Spring Data 版本。我正在使用返回投影列表并仅获取列表中的第一个元素的解决方法,这对我来说效果很好。感谢您的答复!即使在谷歌搜索之后也很难找到答案!

以上是关于从本机查询返回单个投影的主要内容,如果未能解决你的问题,请参考以下文章

使用本机查询从 Spring Data 返回自定义对象

LINQ查询操作符

如何使用 JpaRepository 从 xml 中的命名本机查询返回 Map 作为结果

Spring JPA - “java.lang.IllegalArgumentException:投影类型必须是接口!” (使用本机查询)

如何从同一个 graphQL 查询返回单个或多个结果?

SQLAlchemy 单个查询从两个表中返回列