12

I have a Customer entity from which I only want to select a few fields and their associated CustomerAddresses. I've defined a Spring Data JPA projection interface as follows:

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

But from my Repository method:

CustomerWithAddresses findCustomerWithAddressesById(@Param("id") Integer id);

I keep getting NonUniqueResultException for Customers with multiple CustomerAddresses. Do projections have to have a flat structure, i.e. they don't support Collections the same way true Entities do?

Jason
  • 151
  • 1
  • 4

1 Answers1

1

you have Set<CustomerAddress> getCustomerAddresses(); it's X-to-Many relation. When spring data do select for CustomerWithAddresses it does join , in result set N-records (N - amount of CustomerAddress for CustomerWithAddresses with id = id). You can check if it you change CustomerWithAddresses to List of CustomerWithAddresses .

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

when you use entity sping data gropu multiply result into one element , gouped it by id as id it's unique identifier.

you can do :

1) add into CustomerWithAddresses interface

@Value("#{target.id}")
Integer getId();

and use your query

2) use @Query

@Query("select adr from CustomerWithAddressesEntity adr where adr.id=:id")
CustomerWithAddresses findCustomerWithAddressesById(@Param("id") Integer id);
xyz
  • 5,228
  • 2
  • 26
  • 35