我有一个Customer实体,我只想从中选择一些字段及其关联的CustomerAddresses。我已经定义了一个Spring Data JPA投影接口(interface),如下所示:

public interface CustomerWithAddresses {
    Integer getId();
    String getFirstName();
    String getLastName();
    String getBrandCode();
    String getCustomerNumber();
    Set<CustomerAddress> getCustomerAddresses();
}

但是从我的存储库方法来看:
CustomerWithAddresses findCustomerWithAddressesById(@Param("id") Integer id);

对于具有多个CustomerAddresses的客户,我一直收到NonUniqueResultException。投影是否必须具有平坦的结构,即它们不像真正的实体那样支持集合?

最佳答案

您有Set<CustomerAddress> getCustomerAddresses();,这是X对多关系。当spring数据确实为CustomerWithAddresses选择时,它确实会加入,结果集将成为N记录(N-id为id的CustomerWithAddresses的CustomerAddress数量)。您可以检查是否将CustomerWithAddresses更改为CustomerWithAddresses列表。

List<CustomerWithAddresses> findCustomerWithAddressesById(@Param("id") Integer id);

当您使用实体sping数据gropu将结果乘到一个元素中时,将其作为ID的唯一标识符组合起来。

你可以做 :

1)添加到CustomerWithAddresses接口(interface)
@Value("#{target.id}")
Integer getId();

并使用您的查询

2)使用@Query
@Query("select adr from CustomerWithAddressesEntity adr where adr.id=:id")
CustomerWithAddresses findCustomerWithAddressesById(@Param("id") Integer id);

09-11 07:03