You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:32:50