调用AddressRepo的getAddressResults方法后,如何映射至DTO并生成JSON对象?
问题:将JPA查询结果映射到DTO并生成JSON对象
提供的代码片段
Entity类
@Data @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "ADDRESS") public class Address implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) private int id; @Column(name = "line1") private String line1; @Column(name = "line2") private String line2; }
Repository类
@Repository public interface AddressRepo extends JpaRepository<SourceAddress, int>, JpaSpecificationExecutor<SourceAddress> { @Query(value = "select * from Address ", nativeQuery = true) List<Address> getAdressResults(); }
注:原Repository存在两处错误:泛型应使用
Address而非SourceAddress;ID类型建议用Integer而非基本类型int,避免空指针风险;同时方法名拼写需修正为getAddressResults
DTO类
@Data @NoArgsConstructor @AllArgsConstructor public class AddressDto implements Serializable { private int id; private String line1; private String line2; }
解决方案
1. 先修正Repository代码
@Repository public interface AddressRepo extends JpaRepository<Address, Integer>, JpaSpecificationExecutor<Address> { @Query(value = "select * from ADDRESS ", nativeQuery = true) List<Address> getAddressResults(); }
2. Entity到DTO的映射方法
方法一:手动映射(简单直接,适合字段少的场景)
在业务层手动遍历转换,无需额外依赖:
@Service public class AddressService { @Autowired private AddressRepo addressRepo; public List<AddressDto> getAddressDtos() { List<Address> addressList = addressRepo.getAddressResults(); return addressList.stream() .map(address -> new AddressDto(address.getId(), address.getLine1(), address.getLine2())) .collect(Collectors.toList()); } }
方法二:使用ModelMapper(简化映射代码)
先引入Maven依赖:
<dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>3.1.1</version> </dependency>
配置ModelMapper Bean:
@Configuration public class AppConfig { @Bean public ModelMapper modelMapper() { return new ModelMapper(); } }
业务层使用:
@Service public class AddressService { @Autowired private AddressRepo addressRepo; @Autowired private ModelMapper modelMapper; public List<AddressDto> getAddressDtos() { List<Address> addressList = addressRepo.getAddressResults(); return addressList.stream() .map(address -> modelMapper.map(address, AddressDto.class)) .collect(Collectors.toList()); } }
方法三:使用MapStruct(编译时生成映射代码,性能更优)
引入Maven依赖:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.5.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> <scope>provided</scope> </dependency>
创建映射接口:
@Mapper(componentModel = "spring") public interface AddressMapper { AddressDto addressToAddressDto(Address address); List<AddressDto> addressesToAddressDtos(List<Address> addresses); }
业务层使用:
@Service public class AddressService { @Autowired private AddressRepo addressRepo; @Autowired private AddressMapper addressMapper; public List<AddressDto> getAddressDtos() { List<Address> addressList = addressRepo.getAddressResults(); return addressMapper.addressesToAddressDtos(addressList); } }
3. 生成JSON对象
方式一:Spring自动序列化
Spring Boot中,只要引入spring-boot-starter-web依赖(默认包含Jackson),控制器直接返回DTO列表即可自动转为JSON:
@RestController @RequestMapping("/addresses") public class AddressController { @Autowired private AddressService addressService; @GetMapping public ResponseEntity<List<AddressDto>> getAddresses() { List<AddressDto> addressDtos = addressService.getAddressDtos(); return ResponseEntity.ok(addressDtos); } }
方式二:手动生成JSON字符串
使用Jackson的ObjectMapper手动序列化:
@Autowired private ObjectMapper objectMapper; // 生成JSON字符串 List<AddressDto> addressDtos = addressService.getAddressDtos(); String jsonString = objectMapper.writeValueAsString(addressDtos);
内容的提问来源于stack exchange,提问作者unknown1101
相关产品推荐
相关产品推荐

