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

本文探讨了在使用Spring Data JPA时如何精确地选择要返回的字段,以避免暴露敏感信息。通过三个实例对比,详细说明了正确的方法,并强调了实体类中构造方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比如在获取用户资料时,我们不想把密码等重要信息全部带出。那时,我们就要用到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中创建相应的构造方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值