4

假设我有一个实体

public class Person {
    private String id;
    private String firstname;
    private String lastname;
    private Set<Car> ownedCars;
}

有没有一种方法可以通过示例查询来查找任何名为 James 的人同时拥有法拉利和兰博基尼?

如果我使用:

Person p = new Person();
p.setName("James");
p.getOwnedCars.addCar(new Car("Lamborgnihi"));
p.getOwnedCars.addCar(new Car("Ferrari"));
Example<Person> exampleOfPerson = Example.of(p);
List<Person> foundPersons = personRepository.finaAll(exampleOfPerson);

它似乎只查询人的属性并忽略任何子集合。

4

1 回答 1

2

您可以为此使用查询方法。假设您Car的房产name可以是“兰博基尼”或“法拉利”

interface PersonRepository extends JpaRepository<Person, String> {
  List<Person> findByOwnedCarsNameIn(Collection<String> names);
}

然后你像这样使用它:

personRepository.findByOwnedCarsNameIn(Arrays.asList("Ferrari","Lamborghini"));

一些陷阱:

方法参数可以采用 Collection 的任何子类或数组。

Person 和 Car 上的属性名称必须与上面所示的方法签名和参数名称匹配,以便 spring 知道如何生成查询,即 Person 必须有一个名为“cars”的属性,而 Car 必须有一个名为“name”的属性.

我使用了 JpaRepository,但这适用于 Spring Data JPA 提供的任何 Repository 接口

于 2018-04-30T20:46:37.923 回答