весенние данные jpa найти все на примере вложенного свойства коллекции - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть два объекта. Компания, которая может иметь несколько вложенных адресов.

@Entity
@Data
@Table(name = "company")
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "phone")
    private String phone;

    @OneToMany(mappedBy = "company", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<Address> addresses;
}

Класс адреса выглядит так:

@Data
@Entity
@Table(name = "address")
@ToString(exclude = "company")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "postal_code")
    private String postalCode;

    @Column(name = "city")
    private String city;

    @Column(name = "street")
    private String street;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "company_id")
    private Company company;
}

Я хочу как-нибудь, если это возможно, сделать динамический запрос, который ищет через свойство вложенной коллекции. Я сделал метод поиска, который использует пример соответствия, но результат неправильный. Каждый раз, когда я получал все от БД, а не только компанию с почтовым индексом, который я ищу.

Мой метод поиска выглядит так:

@PostMapping("/search")
    public List<Company> search(@RequestBody final Company company){
        return companyRepository.findAll(Example.of(company,
                ExampleMatcher.matchingAny()
                        .withIgnoreNullValues()
                        .withIgnorePaths("id")
                        .withStringMatcher(ExampleMatcher.StringMatcher.STARTING)));
    }

В моей базе данных у меня есть два объекта, и это результат поиска: enter image description here

Как видите, я получил все от БД вместо единственной первой компании, почтовый индекс которой начинается с 1.

1 Ответ

0 голосов
/ 07 ноября 2018

Привет, вы можете использовать Specification<T>

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

Для этого вам необходимо расширить интерфейс JpaSpecificationExecutor:

public interface UserRepository extends JpaRepository<User> ,JpaSpecificationExecutor<User>{
}

И вам также нужно реализовать свой кастом Specification<T>

И тогда вы можете использовать repository.findAll (ваша реализованная спецификация);

Spring Docs:

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaSpecificationExecutor.html

Я думаю, что это полезно.

...