如何连接两个表并在休眠中获取所有匹配的记录(使用实体 class 映射)

how to join two tables and get all matched record in hibernate(using entity class mapping)

我有两个名为 FeeTerms.javaFeeTermDates.java

的实体

我想使用纯 HQL

得到 all matched records from these two entities

查看实体:

FeeTerms.java

package com.rasvek.cg.entity;
// Generated May 14, 2018 11:39:07 PM by Hibernate Tools 5.1.7.Final

import java.util.HashSet;
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 static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

/**
 * FeeTerms generated by hbm2java
 */
@Entity
@Table(name = "fee_terms", catalog = "campus_guru_01")
public class FeeTerms implements java.io.Serializable {

    private Integer termId;
    private String termName;
    private String termCount;
    private Set<FeeTermDates> feeTermDateses = new HashSet<FeeTermDates>(0);
    private Set<AssocFeeTerms> assocFeeTermses = new HashSet<AssocFeeTerms>(0);

    public FeeTerms() {
    }

    public FeeTerms(String termName, String termCount, Set<FeeTermDates> feeTermDateses,
            Set<AssocFeeTerms> assocFeeTermses) {
        this.termName = termName;
        this.termCount = termCount;
        this.feeTermDateses = feeTermDateses;
        this.assocFeeTermses = assocFeeTermses;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "term_id", unique = true, nullable = false)
    public Integer getTermId() {
        return this.termId;
    }

    public void setTermId(Integer termId) {
        this.termId = termId;
    }

    @Column(name = "term_name")
    public String getTermName() {
        return this.termName;
    }

    public void setTermName(String termName) {
        this.termName = termName;
    }

    @Column(name = "term_count", length = 45)
    public String getTermCount() {
        return this.termCount;
    }

    public void setTermCount(String termCount) {
        this.termCount = termCount;
    }  

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "feeTerms")
    public Set<FeeTermDates> getFeeTermDateses() {
        return this.feeTermDateses;
    }  

    public void setFeeTermDateses(Set<FeeTermDates> feeTermDateses) {
        this.feeTermDateses = feeTermDateses;
    }

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "feeTerms")
    public Set<AssocFeeTerms> getAssocFeeTermses() {
        return this.assocFeeTermses;
    }

    public void setAssocFeeTermses(Set<AssocFeeTerms> assocFeeTermses) {
        this.assocFeeTermses = assocFeeTermses;
    }

}

FeeTermDates.java

package com.rasvek.cg.entity;
// Generated May 14, 2018 11:39:07 PM by Hibernate Tools 5.1.7.Final

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

/**
 * FeeTermDates generated by hbm2java
 */
@Entity
@Table(name = "fee_term_dates", catalog = "campus_guru_01")
public class FeeTermDates implements java.io.Serializable {

    private int tdmId;
    private FeeTerms feeTerms;
    private String date;

    public FeeTermDates() {
    }

    public FeeTermDates(int tdmId, FeeTerms feeTerms) {
        this.tdmId = tdmId;
        this.feeTerms = feeTerms;
    }

    public FeeTermDates(int tdmId, FeeTerms feeTerms, String date) {
        this.tdmId = tdmId;
        this.feeTerms = feeTerms;
        this.date = date;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "tdm_id", unique = true, nullable = false)
    public int getTdmId() {
        return this.tdmId;
    }

    public void setTdmId(int tdmId) {
        this.tdmId = tdmId;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "term_id", nullable = false)
    public FeeTerms getFeeTerms() {
        return this.feeTerms;  
    }  

    public void setFeeTerms(FeeTerms feeTerms) {
        this.feeTerms = feeTerms;
    }

    @Column(name = "date")
    public String getDate() {
        return this.date;
    }

    public void setDate(String date) {
        this.date = date;
    }

}

我试过下面的代码,但我不明白

String hql="select FT.termId , FT.termName , FT.termCount,FT.feeTermDateses  from FeeTerms FT ,FeeTermDates FD where  FT.termId=FD.feeTerms" ;
                query = currentSession.createQuery(hql);

                termDatesList= query.getResultList(); 

如何达到纯粹HQL。我是 Hibernate 和 HQl 的新手。

我在另一个 post,

中有类似下面的内容
public List<Category> getCategoryList(int id) {
    List<Category> groupList;
    Session session = sessionFactory.getCurrentSession();
    Query query = session.createQuery("select c from Category c join fetch c.events where c.parentCategory.categoryId = 1");
    //query.setParameter("id", id);
    groupList = query.list();
    return groupList;
}

是否可以像上面那样实现我的查询?

您可以收到包含您想要的值的 Object[] 列表。喜欢:

String hql="select FT.termId , FT.termName , FT.termCount, FT.feeTermDateses  from FeeTerms FT, FeeTermDates FD where FT.termId = FD.feeTerms.id";

Query query = currentSession.createQuery(hql);
List<Object[]> results = query.getResultList(); 
for (Object[] obj : results) {
    Integer termId = obj[0];
    String termName = obj[1];
    String termCount = obj[2];
    Set<FeeTermDates> feeTermDates  = obj[4];
}

但是,我可以推荐一个更好的版本:

String hql = "SELECT ft FROM FeeTerms ft JOIN ft.feeTermDateses feeTermDateses";
Query query = currentSession.createQuery(hql);
List<FeeTerms> results = query.getResultList(); 

这已经为您带来了所有 FeeTerms FeeTermDates.