如何在Spring JPA查询方法中不使用@Query指定SELECT子句?
Spring Data JPA 不用@Query指定SELECT子句的方法
1. 直接返回单个属性/关联对象
你想实现的返回单个属性的查询方法其实可以直接用,只是要注意方法名的命名规范:关联属性要用驼峰拼接,不能用下划线分隔。比如你原来写的findProfilePhoto_UrlById改成findProfilePhotoUrlById就能正常工作了。
正确示例代码
// 直接查询User的email字段 String findEmailById(Integer id); // 查询关联的整个ProfilePhoto实体 ProfilePhoto findProfilePhotoById(Integer id); // 嵌套查询ProfilePhoto的url字段 String findProfilePhotoUrlById(Integer id);
Spring Data JPA会根据返回类型自动生成对应的SELECT子句:返回String就只查对应单个字段,返回ProfilePhoto就只查关联表的对应字段,完全不用写@Query注解。
2. 用投影灵活返回多字段
如果需要一次性查询多个非整个实体的字段(比如同时查email和profilePhoto的url),可以用投影方式,分两种实现:
接口投影
定义一个接口,把你要查询的字段对应的getter方法写进去,Spring Data JPA会自动生成代理类实现该接口并返回结果:
// 定义投影接口,想查什么字段就加对应的getter interface UserInfo { String getEmail(); // 也可以嵌套定义关联属性的投影 interface PhotoInfo { String getUrl(); } PhotoInfo getProfilePhoto(); } // 在Repository中编写查询方法,返回这个接口类型 UserInfo findProjectedById(Integer id);
DTO类投影
如果需要更可控的返回结构,可以编写一个DTO类,带上对应字段的构造方法,Spring Data JPA会自动用查询结果调用构造方法返回实例:
// DTO类,构造方法参数要和查询的字段对应 class UserDto { private final String email; private final String photoUrl; public UserDto(String email, String photoUrl) { this.email = email; this.photoUrl = photoUrl; } // 需添加getter方法 public String getEmail() { return email; } public String getPhotoUrl() { return photoUrl; } } // Repository中的查询方法 UserDto findDtoById(Integer id);
为啥原来的写法不生效?
你之前写的findProfilePhoto_UrlById用了下划线,在Spring Data JPA的规则里,下划线是用来分隔查询条件关键字的(比如findByLast_Name等价于findByLastName),不是用来访问关联属性的,改成驼峰式命名就可以正常解析了。
内容的提问来源于stack exchange,提问作者prince
相关产品推荐
相关产品推荐

