比如在获取用户资料时,我们不想把密码等重要信息全部带出。那时,我们就要用到jpa query 返回指定字段。
我要在网上查找了下都是比较基础的单表查询。好了,如何写呢?
例如,下面的我们会将user的所有属性都会带出来,
@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 查询返回自定义对象](https://my.oschina.net/u/1045177/blog/550173) 才解决,非常感谢。也分享下我的经验。
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中创建相应的构造方法。