从本机查询返回单个投影
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 版本。我正在使用返回投影列表并仅获取列表中的第一个元素的解决方法,这对我来说效果很好。感谢您的答复!即使在谷歌搜索之后也很难找到答案!以上是关于从本机查询返回单个投影的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JpaRepository 从 xml 中的命名本机查询返回 Map 作为结果
Spring JPA - “java.lang.IllegalArgumentException:投影类型必须是接口!” (使用本机查询)