Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 JPA加载实体,但在@OneToMany列表中,仅加载特定的实体_Java_Jpa_Jakarta Ee_Glassfish_Payara - Fatal编程技术网

Java JPA加载实体,但在@OneToMany列表中,仅加载特定的实体

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

情况: (使用Payara服务器)

我有多个
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());