代码之家  ›  专栏  ›  技术社区  ›  stefan.stt

如何创建在主表行和子表行中同时搜索关系onetomany的jpa查询

  •  0
  • stefan.stt  · 技术社区  · 7 年前

    我有两个实体。其中一个是另一个的孩子,和一个女人有关系。是否可以实现在主实体和所有子实体中同时查找的搜索条件?

    例子: 我有一家有很多员工的公司。如果我搜索一些文本,我想检索所有公司,哪个标题包含该文本,或者它的员工姓名包含该文本。

    以下是示例实体:

    @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 回复  |  直到 7 年前
        1
  •  1
  •   Maciej Kowalski    7 年前

    我想你只需要一个左连接:

    @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,'%')”)