Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用HQL延迟加载用于插入的对象集合_Java_Hibernate_Jpa_Hql_Hibernate Mapping - Fatal编程技术网

Java 使用HQL延迟加载用于插入的对象集合

Java 使用HQL延迟加载用于插入的对象集合,java,hibernate,jpa,hql,hibernate-mapping,Java,Hibernate,Jpa,Hql,Hibernate Mapping,我需要通过HQL从DB加载一个对象集合,目的是仅将这些对象用于在一些新记录中设置关联 考虑以下事项:我需要向所有学分数>50的学生发送一封电子邮件,并且我需要跟踪传输中包含的所有收件人 首先选择学生: Query query = sessionFactory.getCurrentSession().createQuery("from Student student left join fetch student.scores where student.credits>50"); List

我需要通过HQL从DB加载一个对象集合,目的是仅将这些对象用于在一些新记录中设置关联

考虑以下事项:我需要向所有学分数>50的学生发送一封电子邮件,并且我需要跟踪传输中包含的所有收件人

首先选择学生:

Query query = sessionFactory.getCurrentSession().createQuery("from Student student left join fetch student.scores where student.credits>50");
List<Student> students = query.list();

如您所见,只需要Student对象的id,但我不知道如何操作。

您可以使用一个特定于Hibernate的技巧,它允许您设置FK关联,即使您不提供实际的托管实体。假设我们有一个学生ID,我们可以简单地设置:

Student student = new Student();
student.setId(studentId);
rec.setStudent(student);

标准JPA不支持这一点,但它可以与Hibernate一起使用。只需确保您没有从子级到父级的任何级联传播(无论如何都不应该这样)。

最后,我只加载了studentId,并修改了收件人内部的映射以包括studentId:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STD_ID", insertable=false, updatable = false)
private Student student;

@Column(name = "STD_ID", nullable = false)
private Long studentId;
现在我可以简单地设置studentId,而且性能更好

Student student = new Student();
student.setId(studentId);
rec.setStudent(student);
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "STD_ID", insertable=false, updatable = false)
private Student student;

@Column(name = "STD_ID", nullable = false)
private Long studentId;