为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Data JPA将本机查询结果映射到非实体POJO

Spring Data JPA将本机查询结果映射到非实体POJO

慕少森 2019-10-26 12:24:58
我有一个带有本地查询的Spring Data Repository方法@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);并且我想将结果映射到Non-Entity POJO GroupDetails。是否可以,如果可以,请提供示例吗?
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

我认为最简单的方法是使用所谓的投影。它可以将查询结果映射到接口。使用SqlResultSetMapping不方便,并使您的代码难看:)。


来自spring数据JPA源代码的一个示例:


public interface UserRepository extends JpaRepository<User, Integer> {


   @Query(value = "SELECT firstname, lastname FROM SD_User WHERE id = ?1", nativeQuery = true)

   NameOnly findByNativeQuery(Integer id);


   public static interface NameOnly {


     String getFirstname();


     String getLastname();


  }

}

您也可以使用此方法获取投影列表。


请查看此春季数据JPA文档条目,以获取有关预测的更多信息。


注1:


请记住,将您的User实体定义为普通对象-投影接口中的字段必须与该实体中的字段匹配。否则,字段映射可能会损坏(getFirstname()可能返回姓氏等的值)。


笔记2:


如果使用SELECT table.column ...符号,请始终定义与实体名称匹配的别名。例如,此代码将无法正常工作(投影将为每个getter返回null):


@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)

NameOnly findByNativeQuery(Integer id);

但这很好用:


@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)

NameOnly findByNativeQuery(Integer id);

在更复杂的查询的情况下,我宁愿使用JdbcTemplate自定义存储库。


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 1290 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信