关于spring jpa 多表关系查询时,自定义返回对象

比如在获取用户资料时,我们不想把密码等重要信息全部带出。那时,我们就要用到jpa query 返回指定字段。

我要在网上查找了下都是比较基础的单表查询。好了,如何写呢?

例如,下面的我们会将user的所有属性都会带出来,

1
2
3
4
5
 @Query("SELECT u FROM BaseUser u JOIN u.roles roles WHERE roles.roleCode = :roleCode)

 List<BaseUser> findUserByRoleCode(@Param("roleCode") String roleCode);

 ⚠:上面select 后面的 “u” 是一个BaseUser,包括所有的属性。这是我们所不需要的,它泄漏了太多的信息。

 我们要指定字段,怎么定义呢?前面试了两次都失败了,最后参考Spring Data Jpa 查询返回自定义对象 才解决,非常感谢。也分享下我的经验。

1
2
3
4
5
6
7
8
9
 1、 @Query("SELECT name,id,org FROM BaseUser u JOIN u.roles roles WHERE roles.roleCode = :roleCode)

 ⚠ 这个根本就不能编译通过。

 2、 @Query("SELECT u.name,u.id,u.org  FROM BaseUser u JOIN u.roles roles WHERE roles.roleCode = :roleCode)

 ⚠ 这个可以编译通过 但返回的不是BaseUser对象,只包括name,id属性和 org对象。不符合我的条件。

3、@Query("SELECT new BaseUser(u.id,u.loginname,u.roles,u.org)  FROM BaseUser u JOIN u.roles roles WHERE roles.roleCode = :roleCode)

只有这个是正确的,返回了baseUser对象。这个要注意的是必须在实体baseuser中创建相应的构造方法。