Java JPA加载实体,但在@OneToMany列表中,仅加载特定的实体
情况: (使用Payara服务器) 我有多个Java JPA加载实体,但在@OneToMany列表中,仅加载特定的实体,java,jpa,jakarta-ee,glassfish,payara,Java,Jpa,Jakarta Ee,Glassfish,Payara,情况: (使用Payara服务器) 我有多个组s,每个组都有自己特定的组会议s 这些GroupMeetings被跟踪多年。 每个组包含100-10000个GroupMeetings。 但通常只查询和使用当年的GroupMeetings 问题: 如何加载所有组s,但仅加载特定时间间隔内每个组的GroupMeeting列表,例如仅加载2019年的GroupMeetings?或者,如果需要,具体年份或范围,即2017-2021年等 如果我只是运行一个“SELECT*”,那么使用FetchType.LA
组
s,每个组
都有自己特定的组会议
s
这些GroupMeeting
s被跟踪多年。
每个组包含100-10000个GroupMeeting
s。
但通常只查询和使用当年的GroupMeeting
s
问题:
如何加载所有组
s,但仅加载特定时间间隔内每个组的GroupMeeting
列表,例如仅加载2019年的GroupMeeting
s?或者,如果需要,具体年份或范围,即2017-2021年等
如果我只是运行一个“SELECT*”,那么使用FetchType.LAZY
我将得到一个emtpy列表
,但只要我在代码中的某个地方访问它,所有项目都将被加载
问题:
最好的策略是什么,即有点效率但不太复杂
- 是否有一个简单的SQL/JPQL查询可以使用下面的类运行
- 是否需要一些结构性的改变,特别是在注释方面
我应该考虑标准API吗?< /LI>
- 我是否必须使用两个
列表
s,一个用于常用会议,另一个用于“旧”会议
示例:
以下是两个类:
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<>();
}
您可以使用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<>();
}
如果您使用的是Spring,您可以进一步进行研究,使“全局过滤器”更容易使用。Ah man抱歉,我之前没有接受这一点。仍然没有检查它是否适合我,从那以后就没有时间了。但是谢谢你回答这个问题!
@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());