java - 在 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;
}
解决方案
您还没有提到如何使用 hibernate 检索该数据。您是否尝试过使用@Query(从Record left join Submission sub on r.submissionId = sub.id where ..."中选择r)?
推荐阅读
- android-studio - Android Studio - 设备文件资源管理器:权限被拒绝
- python - 可以实时监听 firebase_admin firestore 的事件吗?
- elasticsearch - 如何查询具有精确字段 1 匹配和非空字段 2 匹配的弹性搜索文档
- angular - 突出显示列表项文本颜色
- php - 如何在 woocommerce 中获取 thumbnail_id?
- javascript - ajax没有在声明的变量上设置值
- asp.net - 创建一个动态的 asp.net 链接列表
- gridlayoutmanager - 将 LinearLayoutManager 更改为 GridLayoutManager
- kubernetes - 为 kubernetes pod 分配外部 ip
- codeigniter - 如何使用 codeigniter 更新上传的图像。必须来自数据库和目录