如何将作为字段关联的对象列表检索到实体类中



当我通过客户的任何字段找到客户时,一切顺利,我得到返回全局对象的 JSON。

我正在编写一个代码,以通过姓氏查找客户。客户实体具有一个声明了字段 lastName 的对象。因此,我希望我的端点像第一种情况一样返回客户全局对象。

我已经进入我的邮递员状态 200 OK,但有和空的身体。有什么解决办法吗?谢谢

下面是一个示例。lastName 字段同时声明到 prefBillAddressUid 和 prefShipAddressUid 对象中

@Entity
@Table(name = "tcustomer")
public class Customer implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "pk_sequence",sequenceName = "sequence_tcustomer",initialValue = 1000, allocationSize = 100)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pk_sequence")
private Long uidpk;
@Column(name = "user_id", nullable=false)
private String userId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "pref_bill_address_uid")
private CustomerAddress prefBillAddressUid;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "pref_ship_address_uid")
private CustomerAddress prefShipAddressUid;
...
//getters and setters 
//constructors
 }

我的仓库

  @Query(value = "SELECT c FROM CustomerAddress c WHERE c.lastName = :lastName")
  CustomerAddress findByLastName(   @Param("lastName") String lastName);

服务实施

    @Override
    public CustomerAddressDto findByLastName(String lastName) {
    CustomerAddress result = customerRepository.findByLastName(lastName);
    return customerAddressMapper.customerAddressToCustomerAddressDto(result);
}

这是我的资源

    @GetMapping(SEARCH_CUSTOMER_LAST_NAME_ENDPOINT)
@ResponseStatus(value = HttpStatus.OK)
@ApiResponses(value = {
        @ApiResponse(code = 200,  message = "OK", response = CustomerAddressDto.class),
        @ApiResponse(code = 500, message = "Unexpected error", response = CustomerAddressDto.class)
})
@Timed
public  ResponseEntity getCustomerByLastName ( @PathVariable String lastName) throws URISyntaxException {
    if (log.isDebugEnabled()){
        log.debug("[CustomerResource] GET {} : Retrieving Customer ({})", SEARCH_CUSTOMER_LAST_NAME_ENDPOINT, lastName);
    }
    CustomerAddressDto customerAddressDto = customerService.findByLastName(lastName);
    return Optional.ofNullable(customerAddressDto)
            .map(result->{
                if (log.isDebugEnabled()){
                    log.debug("[CustomerResource] Customer ({}) retrieved", result.getLastName());
                }
                return new ResponseEntity<>(HttpStatus.OK);
            })
            .orElse(new ResponseEntity(new ResponseError(HttpStatus.NOT_FOUND.getReasonPhrase(),
                    "The Customer with lastName " + lastName + " does not exists"), null,HttpStatus.NOT_FOUND)
            );
}

客户地址类

@Entity
@Table(name="taddress")
public class CustomerAddress implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "pk_sequence",sequenceName = "sequence_taddress",initialValue = 1000, allocationSize = 100)
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "pk_sequence")
private Long uidpk;
@Column(name = "last_name")
private String lastName;
@Column(name = "first_name")
private String firstName;
@Column(name = "phone_number")
private String phoneNumber;
@Column(name= "fax_number")
private String faxNumber;
@Column(name = "street_1")
private String street1;
@Column(name= "street_2")
private String street2;
@Column(name= "city")
private String city;
@Column(name= "sub_country")
private String subCountry;
@Column(name= "zip_postal_code")
private String zipPostalCode;
@Column(name= "country")
private String country;
@Column(name = "commercial")
private Boolean commercial;
@Column(name = "guid", nullable=false)
private String guid;
@Column(name = "customer_uid")
private Long customerUid;
@Column(name= "type")
private String type;
@Column(name = "organization")
private String organization;
...
//getters ans setters
}

首先,您不能从 CustomerRepository 返回 CustomerAddress。
一些替代方案是

  1. 要根据CustomerRepository的姓氏检索客户地址,您可以执行以下操作

    Customer findByPrefBillAddressUid_LastName(String lastName);

spring-data 会制定查询,你不需要@Query。但请注意,返回类型如果Customer且不CustomerAddress。因此,您将获得具有正确客户地址的客户对象。

  1. 如果要返回 CustomerAddress,则需要创建 CustomerAddressRepository 并编写如下方法

    CustomerAddress findByLastName(String lastName);

  2. 使用投影创建这样的界面

     interface CustomerShort {
        CustomerAddress getPrefBillAddressUid();
    }
    

    然后你的客户存储库需要有这样的方法

    interface CustomerRepository extends CRUDRepository<Customer, UUID> {
      Collection<CustomerShort> findByPrefBillAddressUid_LastName(String lastName);
    }
    

最新更新