情况:
(使用Payara服务器)
我有多个Group
,每个Group
都有自己的特定GroupMeeting
集。
这些GroupMeeting
跟踪了多年。
每个Group
包含100-10000个GroupMeeting
。
但通常仅查询和使用当年的GroupMeeting
。
问题:
如何加载所有Group
,但仅加载特定时间间隔的每个Group
的GroupMeeting
列表,例如仅加载2019年的GroupMeeting
?或者,如果需要,是特定的年份或范围,即2017-2021等?
如果我只是运行“ SELECT *”,那么使用FetchType.LAZY
时,我将得到一个空的List<GroupMeeting>
,但是一旦我在代码中的某个位置访问它,就会加载所有项目。
题:
最好的策略是什么,即有些效率,但又不会过于复杂?
是否可以使用以下类运行简单的SQL / JPQL查询?
是否需要进行某些结构上的更改,尤其是在注释中?
我应该考虑使用Criteria API吗?
我是否必须使用两个List<GroupMeeting>
,一个用于常用会议,另一个用于“旧”会议?
例:
这是两个类:
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
@Entity
public class Group {
@Id //
@GeneratedValue() //
private long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinTable(name = "group_meetings") //
private final List<GroupMeeting> meetings = new ArrayList<>();
}
和
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class GroupMeeting {
@Id //
@GeneratedValue() //
private long id;
private String title;
private Date start;
private Date end;
}
最佳答案
您可以使用Hibernate过滤器来实现这一目标,例如:
@Entity
@FilterDef(name="groupMeetingFilter",
parameters={@ParamDef( name="fromDate", type="date"), @ParamDef(name="toDate", type="date")} )
public class Group {
@Id //
@GeneratedValue() //
private long id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinTable(name = "group_meetings")
@Filter(
name = "groupMeetingFilter",
condition="start <= :fromDate and end >= :toDate"
)
private final List<GroupMeeting> meetings = new ArrayList<>();
}
您需要在应用程序中的某处启用过滤器,如下所示:
Session session = HibernateUtil.getSessionFactory().openSession();
Filter filter = session.enableFilter("groupMeetingFilter");
//Define here the dates that you want
filter.setParameter("fromDate", new Date());
filter.setParameter("toDate", new Date());
您可以进行进一步的研究,并使过滤器全局可用,例如,如果您使用的是Spring,则更容易。
关于java - JPA加载实体,但在@OneToMany列表中,仅特定于加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58347130/