поисковый запрос гибернации из списка, точно совпадающего с дочерней таблицей, с отношениями «один-много» - PullRequest
0 голосов
/ 15 октября 2018

Я использую spring-boot и hibernate.Я использую one to many relationships.

В основной таблице содержатся сведения о пользовательских журналах, например

jobId(pk), department, startDate. The child table is the category table(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;
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

JOIN FETCH .

Ключевое слово FETCH оператора JOIN 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...