我有一个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);