针对这个话题,我提供以下完整攻略,包括两条示例说明。
Spring Data Jpa实现自定义repository转DTO
背景
在实际开发中,通常需要将领域模型(Entity)转换成数据传输对象(DTO)输出给客户端。如果每个DTO都手动转换一次,那么会导致大量的重复代码和工作量,因此我们需要一个高效的方式来完成这个任务。本文介绍如何通过Spring Data Jpa实现自定义repository转DTO。
实现步骤
1. 创建DTO
首先需要创建对应的DTO类。DTO类中包含领域模型的属性及其对应的getter和setter方法,用于在controller中输出给客户端。
public class UserDTO {
private Long id;
private String name;
private Integer age;
// getter 和 setter 方法省略
}
2. 创建自定义repository
创建一个自定义repository,用于扩展Spring Data Jpa原生的repository接口。
@NoRepositoryBean
public interface UserRepositoryCustom {
UserDTO findUserDTOById(Long id);
}
其中@NoRepositoryBean注解用于告诉Spring Data JPA这个接口不是实体类的repository,只是被其他repository扩展使用。这个接口中定义了一个findUserDTOById方法,用于查找指定id的用户,并将结果转化为DTO返回给客户端。
3. 创建自定义repository实现类
接下来创建自定义repository实现类,继承自上一步中创建的自定义repository。
public class UserRepositoryImpl implements UserRepositoryCustom {
@Autowired
private EntityManager entityManager;
@Override
public UserDTO findUserDTOById(Long id) {
TypedQuery<Object[]> query = entityManager.createQuery(
"SELECT u.id, u.name, u.age FROM User u WHERE u.id = :id",
Object[].class
);
query.setParameter("id", id);
Object[] result = query.getSingleResult();
UserDTO dto = new UserDTO();
dto.setId((Long) result[0]);
dto.setName((String) result[1]);
dto.setAge((Integer) result[2]);
return dto;
}
}
这个实现类中使用了JPA Criteria API来查询用户信息,并将结果转化为DTO返回给客户端。
4. 创建继承自JpaRepository的repository接口
接下来创建一个继承自JpaRepository,并扩展了第二步中创建的自定义repository的接口。
@Repository
public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
}
5. 使用自定义repository
最后,在controller中使用自定义repository获取DTO数据。
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users/{id}")
public UserDTO getUserDTOById(@PathVariable Long id) {
return userRepository.findUserDTOById(id);
}
}
示例说明
示例1:查找单个用户
在上一节创建自定义repository实现类中,我们使用了JPA Criteria API来查询用户信息。下面提供一个更加简单的示例,使用Spring Data Jpa原生的findById方法来获取用户信息。
public class UserRepositoryImpl implements UserRepositoryCustom {
@Autowired
private UserRepository userRepository;
// 获取用户DTO
@Override
public UserDTO findUserDTOById(Long id) {
User user = userRepository.findById(id).orElse(null);
UserDTO dto = new UserDTO();
dto.setId(user.getId());
dto.setName(user.getName());
dto.setAge(user.getAge());
return dto;
}
}
示例2:查询多个用户
如果需要查询多个用户信息并将它们转化为DTO返回给客户端,可以在自定义repository接口中定义一个findAllUserDTO方法,返回值为List
public interface UserRepositoryCustom {
UserDTO findUserDTOById(Long id);
List<UserDTO> findAllUserDTO();
}
同时在自定义repository实现类中实现这个方法。
public class UserRepositoryImpl implements UserRepositoryCustom {
@Autowired
private UserRepository userRepository;
// 获取单个用户DTO
@Override
public UserDTO findUserDTOById(Long id) {
User user = userRepository.findById(id).orElse(null);
UserDTO dto = new UserDTO();
dto.setId(user.getId());
dto.setName(user.getName());
dto.setAge(user.getAge());
return dto;
}
// 获取所有用户DTO
@Override
public List<UserDTO> findAllUserDTO() {
List<User> userList = userRepository.findAll();
List<UserDTO> dtoList = new ArrayList<>(userList.size());
for (User user : userList) {
UserDTO dto = new UserDTO();
dto.setId(user.getId());
dto.setName(user.getName());
dto.setAge(user.getAge());
dtoList.add(dto);
}
return dtoList;
}
}
在controller中使用自定义repository获取DTO数据。
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
// 获取单个用户DTO
@GetMapping("/users/{id}")
public UserDTO getUserDTOById(@PathVariable Long id) {
System.out.println(userRepository.getClass());
return userRepository.findUserDTOById(id);
}
// 获取所有用户DTO
@GetMapping("/users/all")
public List<UserDTO> getAllUserDTO() {
return userRepository.findAllUserDTO();
}
}
以上就是Spring Data Jpa实现自定义repository转DTO的完整攻略,相信可以帮助到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Data Jpa实现自定义repository转DTO - Python技术站