Спецификация JPA - поиск одновременно в строках основной таблицы и дочерних строках с отношением OneToMany - PullRequest
0 голосов
/ 11 июля 2019

У меня есть две сущности. Один из них является дочерним по отношению к другому с OneToMany. Можно ли реализовать критерии поиска, которые одновременно выполняют поиск в основной и всех дочерних сущностях?

Пример: у меня есть компания со многими сотрудниками. Если я выполняю поиск по какому-либо тексту, я хочу получить информацию обо всех компаниях, название которых содержит этот текст, или имена его сотрудников содержат этот текст.

Вот примеры объектов:

@Entity
public class Company extends AbstractEntity {
    @Column(nullable = false, unique = true)
    private String uuid;

    @Column(nullable = false)
    private String companyName;

    @OneToMany(mappedBy = “company”, cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    protected Set<Employee> employees = new HashSet<>();

}

@Entity
public class Employee extends AbstractEntity {
    @Column(nullable = false, unique = true)
    private String uuid;

    @Column(nullable = false)
    private String firstName;

    @Column(nullable = false)
    private String lastName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = “company_id”, nullable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Company company;
}

Вот пример запроса, который я хочу преобразовать в критерии спецификации

@Query(value = “SELECT DISTINCT c from Company c left outer join c.employees e 
            WHERE c.companyName LIKE CONCAT('%',:text,'%') 
              or e.firstName  LIKE CONCAT('%',:text,'%')  
              or  e.lastName  LIKE CONCAT('%',:text,'%')”)

1 Ответ

0 голосов
/ 11 июля 2019

Если вы используете хранилище данных Spring JPA, ваш интерфейсный метод будет выглядеть следующим образом.

Company findByCompanyNameConatainingOrEmployeesFirstNameConatainingOrEmployeeslastNameConataining(String searchTextCompanyTitle, String searchTextEmployeeFName, String searchTextEmployeeLName);

Если вы не используете хранилище данных, пожалуйста, объясните ваш дизайн доступа к данным, чтобы получить точный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...