gpt4 book ai didi

java - JPA/Hibernate 查询但不分配子对象

转载 作者:行者123 更新时间:2023-11-29 09:17:27 25 4
gpt4 key购买 nike

好吧,我认为我对 JPA/Hibernate 的理解有些欠缺。我有两个表:代表学生的 STUDENTS 和代表学生对类(class)的分配的 CC。 CC 表有一个引用学生的 STUDENTID 列。我正在尝试做一个简单的查询,我返回 CC 记录及其相关的学生记录。我的 CC 类看起来像这样(删除了很​​多东西):

@Entity
@Table(name="cc")
public class CC {
...
@Column(name="studentid", nullable=false, updatable=false)
private Integer studentid;

@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumns({ @JoinColumn(name="studentid", referencedColumnName="id",
insertable=false, updatable=false) })
private Student student;
...
}

我必须指定 referencedColumnName 因为“ID”不是 STUDENTS 表的主键。我正在尝试查询如下:

EntityManager em = getCurrentEntityManager();
Query query = em.createQuery ( "select cc from CC cc inner join fetch cc.student where cc.sectionid=:sectionid");
query.setParameter("sectionid", sectionId);
List<CC> rows = query.getResultList();
if (!CollectionUtils.isEmpty(rows)) for (CC cc: rows) {
Student student = cc.getStudent();
//// PROBLEM: student object is null here (though studentid is correct)!
}

我可以看到 hibernate 正在正确执行查询,将表连接在一起,甚至在查询投影中返回学生表的列:

select cc0_.dcid as dcid21_0_, student1_.DCID as DCID7_1_, cc0_.course_number as course2_21_0_,
... student1_.FIRST_NAME as FIRST28_7_1_, student1_.GENDER as GENDER7_1_, ...
from cc cc0_ inner join STUDENTS student1_
on cc0_.studentid=student1_.ID where cc0_.sectionid=?

如上所述,问题在于 CC 的“学生”子对象始终为空,即使 STUDENTID 列不为空并且是正确的。我确定我做错了什么,但是什么?

最佳答案

我可能对 hibernate 的抓取方式有误,但是,这里的这一行可能会证明您的症结所在:

@ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.ALL})

由于您告诉 Hibernate 使用 LAZY 获取,它不会为引用的 Class 对象拉回持久化的 Student 对象。这有助于缩短查询加载时间,Hibernate 在启用延迟加载的情况下优化对象子类继承。如果将获取类型更改为 EAGER,我想您会看到预期的结果。

关于java - JPA/Hibernate 查询但不分配子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com