我有一个Spring Data repository方法和一个native query
@Query(value = "SELECT g.*, gm.* FROM group g LEFT JOIN group_members gm ON g.group_id = gm.group_id and gm.user_id = :userId WHERE g.group_id = :groupId", nativeQuery = true)
GroupDetails getGroupDetails(@Param("userId") Integer userId, @Param("groupId") Integer groupId);
字符串
我想把结果Map到非实体POJO GroupDetails
。
有没有可能,你能举个例子吗?
9条答案
按热度按时间pepwfjgg1#
我认为最简单的方法是使用所谓的投影。它可以将查询结果Map到接口。使用
SqlResultSetMapping
是不方便的,会让你的代码变丑:)。一个来自spring data JPA源代码的例子:
字符串
您也可以使用此方法来获取投影列表。
查看这个Spring Data JPA文档条目以了解有关投影的更多信息。
注1:
请记住将
User
实体定义为普通-来自投影接口的字段必须匹配此实体中的字段。否则字段Map可能会中断(getFirstname()
可能返回姓氏等值)。注2:
如果你使用
SELECT table.column ...
表示法,总是定义与实体名称匹配的别名。例如,这段代码将无法正常工作(投影将为每个getter返回null):型
但这很好:
型
在更复杂的查询情况下,我宁愿使用
JdbcTemplate
与自定义存储库。hpxqektj2#
假设GroupDetails和orid的答案一样,你试过JPA 2.1@ConstructorResult吗?
字符串
并在存储库界面中使用以下内容:
型
根据Spring Data JPA文档,Spring将首先尝试查找与方法名称匹配的命名查询-因此通过使用
@NamedNativeQuery
,@SqlResultSetMapping
和@ConstructorResult
,您应该能够实现该行为lhcgjxsq3#
我认为Michal的方法更好。但是,还有一种方法可以从原生查询中获得结果。
字符串
现在,您可以将此2D字符串数组转换为所需的实体。
x9ybnkn64#
您可以按照自己的方式编写本机或非本机查询,并且可以使用自定义结果类的示例 Package JPQL查询结果。使用查询中返回的列名创建DTO,并使用查询返回的序列和名称创建全参数构造函数。然后使用以下方式查询数据库。
字符串
创建DTO:
型
mo49yndu5#
使用JPA PROJECTIONS在您的情况下,可能需要将数据作为自定义类型的对象进行检索。这些类型反映了根类的部分视图,仅包含我们关心的属性。这就是投影派上用场的地方。首先将Entity声明为@immutable
字符串
public class String {
型
设置存储库
型
然后在仓库界面中使用它:
型
hc8w905p6#
这是我的解决方案转换为Map,然后自定义对象
字符串
fbcarpbf7#
使用接口中的default方法,并获取ResultyManager以获得设置ResultTransformer的机会,然后您可以返回纯POJO,如下所示:
字符串
BaseRepository.java是这样的:
型
此解决方案不会影响存储库接口文件中的任何其他方法。
rjjhvcjd8#
https://stackoverflow.com/a/71501509/4735043
mrzz3bfm9#
你可以这样做
字符串
必须有像这样的构造函数
型