Как создать запрос JPA, который одновременно выполняет поиск в строках основной таблицы и в дочерних строках с отношением OneToMany - PullRequest
0 голосов
/ 09 июля 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 c from Company c WHERE c.companyName LIKE CONCAT('%',:text,'%') or (SELECT e from c.employees e WHERE e.firstName  LIKE CONCAT('%',:text,'%')  OR  e.lastName  LIKE CONCAT('%',:text,'%'))”)
List<Company> findByText( @Param(“text” String text)

1 Ответ

1 голос
/ 09 июля 2019

Я думаю, что все, что вам нужно, это присоединиться слева:

@Query(value = “SELECT 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,'%')”)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...