java - 如何创建同时在主表行和具有 OneToMany 关系的子行中进行搜索的 JPA 查询

标签 java sql spring spring-boot jpa

我有两个实体。其中一个是另一个的子级,并且与 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)

最佳答案

我认为您所需要的只是这里的左连接:

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

关于java - 如何创建同时在主表行和具有 OneToMany 关系的子行中进行搜索的 JPA 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948396/

相关文章:

java - Spring MVC + GWT RPC

java - Spring 4 MVC 验证不工作 - BindingResult hasErrors 是 false

java - 使用 Android 向 API 发送信息

SQL 通过 ADO 在 Delphi 中返回值

mysql - 从 mysql 检索满足 IN 子句中所有值的记录

sql - 如何在不获取重复列名的情况下选择 SQL 连接中的所有字段?

java - 为什么我的 IntelliJ IDEA 项目找不到这个导入?

java - 运算符 && 不能应用于 boolean,char

java - Camunda 用于存储数据

java - java实现复选框列表的方法