Java 使用HQL延迟加载用于插入的对象集合
我需要通过HQL从DB加载一个对象集合,目的是仅将这些对象用于在一些新记录中设置关联 考虑以下事项:我需要向所有学分数>50的学生发送一封电子邮件,并且我需要跟踪传输中包含的所有收件人 首先选择学生: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
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;