情况:
(使用Payara服务器)

我有多个Group,每个Group都有自己的特定GroupMeeting集。

这些GroupMeeting跟踪了多年。
每个Group包含100-10000个GroupMeeting
但通常仅查询和使用当年的GroupMeeting

问题:

如何加载所有Group,但仅加载特定时间间隔的每个GroupGroupMeeting列表,例如仅加载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/

10-10 09:20