我有以下实体:Java的春季数据@Query与@OneToMany关系不返回结果
@Entity
public class Customer extends BaseEntity {
private String firstname;
private String lastname;
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
private Set<Address> addresses;
...
@Entity
public class Address extends BaseEntity {
private String street;
private String houseNumber;
private String zipCode;
private String city;
@ManyToOne
private Customer customer;
...
而下面的库接口类:
@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long> {
@Query("select c from Customer c join c.addresses a where (a.city = :cityName)")
List<Customer> findByCity(@Param("cityName")String city);
}
现在,我试图运行以下集成测试,但它失败了,我绝对不知道为什么。不幸的是,我和春天有个初学者,我试图了解它;-)
@Test
public void testFindCustomerByCity() {
Customer customer = new Customer("Max", "Tester");
Address address = new Address("Street", "1", "12345", "City");
HashSet<Address> addresses = new HashSet<Address>();
addresses.add(address);
customer.setAddresses(addresses);
Customer savedCustomer = customerRepository.save(customer);
Assert.assertTrue(savedCustomer.getId() > 0);
List<Customer> customerList = customerRepository.findByCity("City");
Assert.assertThat(customerList.size(), is(1));
}
的错误信息是:
java.lang.AssertionError: Expected: is <1> but: was <0>
为什么结果是空的。我的测试设置是否错误?实体关系? 如果你能帮助我,那会很好。
您尚未将地址上的客户设置为客户的地址。 –
@M好,我接着说:address.setCustomer(客户);'和它的作品...但我真诚不明白它...我想,这是足以让父实体孩子的实体。也许你可以很快解释它,或给我一个链接网址作为提示...无论如何,感谢你的快速答案。 – Adrian
您有一个'null'客户的地址,您指定关系由客户地址管理。如果没有设置数据库应该如何知道存在关系。同样,执行'setAddresses'是向客户添加地址的一种非常糟糕的方式。删除该方法并创建一个'addAddress'方法,您可能在其中管理关系。 –