java - hibernate从与具有一对多关系的子表完全匹配的列表中搜索查询

标签 java mysql hibernate

我正在使用spring-boothibernate。我正在使用一对多关系

在主表中,它包含用户日志的详细信息,例如

jobId(pk)、部门、开始日期。子表是类别表(Id(pk),catId,catDesc,jobId(fk))

即父表中的每个jobId可以有多个类别。现在我想从主表和子表中获取与类别列表(子表值)完全匹配的所有值。

createQuery("select * from parent p, child c where p.jobId=c.jobId AND c.catId IN ("+catId+" ) )

这里catId是一个值列表。但我只想获取那些与所有值匹配的值,并且查询是动态的。

package com.assorted.product.model;
import java.io.Serializable;
import java.util.Date;`enter code here`
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name = "parent")
public class Parent implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "JOB_ID")
    private long jobId;
    @Column(name = "USER_ID")
    private String userId;
    @Column(name = "COUNTRY_NAME")
    private String countryName;
    @Column(name = "DEPT_ID")
    private long depId;
    @Column(name = "DEPT_NAME")
    private String depName;
    @Column(name = "START_DATE")
    @Temporal(TemporalType.DATE)
    private Date startDate;
    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    @JoinColumn(name="JOB_ID",referencedColumnName="JOB_ID")
    private Set<CategoryLogs> categoryLogs;
    public long getJobId() {
        return jobId;
    }
    public void setJobId(long jobId) {
        this.jobId = jobId;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getCountryName() {
        return countryName;
    }
    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
    public long getDepId() {
        return depId;
    }
    public void setDepId(long depId) {
        this.depId = depId;
    }
    public String getDepName() {
        return depName;
    }
    public void setDepName(String depName) {
        this.depName = depName;
    }
    public Date getStartDate() {
        return startDate;
    }
    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }
    public Set<CategoryLogs> getCategoryLogs() {
        return categoryLogs;
    }
    public void setCategoryLogs(Set<CategoryLogs> categoryLogs) {
        this.categoryLogs = categoryLogs;
    }
}

package com.assorted.product.model;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "child")
public class CategoryLogs {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "ID")
    private String id;
    @Column(name = "CAT_ID")
    private long catId;
    @Column(name = "CAT_NAME")
    private String catName;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "JOB_ID")
    private Parent parent;
    public CategoryLogs(){
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public long getCatId() {
        return catId;
    }
    public void setCatId(long catId) {
        this.catId = catId;
    }
    public String getCatName() {
        return catName;
    }
    public void setCatName(String catName) {
        this.catName = catName;
    }
    public Parent getParent() {
        return parent;
    }
    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

最佳答案

加入获取

JOIN FETCH 语句的 FETCH 关键字是 JPA 特定的。它告诉持久性提供者不仅要在查询中连接 2 个数据库表,还要初始化返回实体上的关联。您可以将其与 JOIN 和 LEFT JOIN 语句一起使用。

List<Parent> parents = em.createQuery("SELECT p FROM Parent p JOIN FETCH p.categoryLogs c 
  WHERE c.catId IN (:cat_Ids) " , Parent.class)
  .setParameterList("cat_Ids",your_cat_id_list )
   .getResultList();

关于java - hibernate从与具有一对多关系的子表完全匹配的列表中搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52808659/

相关文章:

java - servlet 中的 printWriter()

mysql - "retry mysql database connection if fail"的 Java 代码帮助

Mysql 计数与Where 子句不同

php - Docker 中的 MySQL 数据库访问被拒绝

java - Hibernate - org.hibernate.hql.internal.ast.QuerySyntaxException : Client is not mapped

java - 以 Java 8 风格重写 "matching algorithm"

java - 如何计算当前在我的应用程序中打开的第三方应用程序的时间

mysql - 从每组中选择前 N 行,第一个最大行,相差一列(Spring、Hibernate、JPQL)

java - 如何在接口(interface)中获取非抽象方法?

java - 序列化:基本理解和文档