首页 > 解决方案 > 在 Hibernate 中连接表时如何忽略某些列?

问题描述

你好这是我的两张桌子:

记录和提交。

在此处输入图像描述

在提交时,它有 1 个复合主键:(submission_id, question_id)。一个提交编号可以有多个问题编号。例如:

在此处输入图像描述

至于记录,它有一个复合主键:(student_id,exam_id)。它看起来像这样:

我想加入这两个表,如 MySQL:

select * from record 
left join submission 
on record.submission_id = submission.submission_id.

在此处输入图像描述

但是在hibernate中,我已经成功加入了这两个表,但是它给了我以下hql:

Hibernate: 
    select
        ...all columns...
    from
        record record0_ 
    inner join
        submission submission1_ 
            on record0_.submission_id=submission1_.submission_id 
            and record0_.question_id=submission1_.question_id 
    where
        1=1

在这种情况下,我将在结果中得到 0 行。

我不希望它在 on 子句之后使用“and record0_.question_id=submission1_.question_id”,因为我的记录表中​​没有 question_id。

但是当我在 Record 类中添加 Submission 属性时,我必须将所有主键添加到 @joinColumns() 中,如下所示:

// Record class

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "record")
public class Record implements java.io.Serializable{
    private static final long serialVersionUID = 1L;

    // Other columns I don't need to show


    @Column(name = "submission_id")
    private Integer submissionId;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "submission_id", referencedColumnName = "submission_id",insertable=false, updatable=false),
            @JoinColumn(name = "question_id", referencedColumnName = "question_id",insertable=false, updatable=false)
    })
    private Submission submission;
}

我的提交类是这样的:

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "submission")
public class Submission implements java.io.Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "submission_id")
    private Integer submissionId;

    @Id
    @Column(name = "question_id")
    private Integer questionId;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "submission")
    private Record record;

}

任何人都可以给我一些建议吗?

--------我如何组合这些表格--------

实际上,我加入了 4 个表,所有这些连接都有上面声明的相同问题。

下面的代码是我如何组合这 4 个表(记录、提交、问题、可选)

@Override
    public List<RcdSubQuesOpt> getRcdSubQuesOpt(int studentID, int examId) {
        Session session = this.getSession();
        // RcdSubQuesOpt  --> this is a class to store attributes from different tables(classes)
        List<RcdSubQuesOpt> results;

        Transaction transaction = null;
        transaction = session.beginTransaction();

        CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
        CriteriaQuery<RcdSubQuesOpt> criteriaQuery = criteriaBuilder.createQuery(RcdSubQuesOpt.class);
        
        // To combine these tables use join
        Root<Record> pRoot = criteriaQuery.from(Record.class);
        Join<Record, Submission> rcd2sub = pRoot.join(Record_.submission);
        Join<Submission, Question> sub2que = rcd2sub.join(Submission_.question);
        Join<Question, Optional> que2opt = sub2que.join(Question_.optional);

        // Attributes in RcdSubQuesOpt class
        // get these columns from result and assign them to RcdSubQuesOpt class
        criteriaQuery.multiselect(
                pRoot.get("studentId"),
                pRoot.get("examId"),
                rcd2sub.get("questionId"),
                rcd2sub.get("stuAnswer"),
                sub2que.get("content"),
                que2opt.get("content"),
                que2opt.get("answer"));


        // Predicate predicate = pRoot.get("examId").equals(1);
        criteriaQuery.where();

        results = session.createQuery(criteriaQuery).getResultList();
        transaction.commit();

        return results;
    }

标签: javahibernatehql

解决方案


您还没有提到如何使用 hibernate 检索该数据。您是否尝试过使用@Query(从Record left join Submission sub on r.submissionId = sub.id where ..."中选择r)?


推荐阅读