Java 如何使用Hibernate检索集合的特定成员?
我想知道是否有任何方法可以检索记录及其集合成员的具体数量 我有一个叫做MyGroup的班级,它有一个学生名单,每个学生一次可以在一个小组里。我需要检索每个组的可用学生列表。如果我检索每个组的所有学生并找到可用的学生,则需要大量内存来在集合中运行循环并检查每个学生的可用字段Java 如何使用Hibernate检索集合的特定成员?,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我想知道是否有任何方法可以检索记录及其集合成员的具体数量 我有一个叫做MyGroup的班级,它有一个学生名单,每个学生一次可以在一个小组里。我需要检索每个组的可用学生列表。如果我检索每个组的所有学生并找到可用的学生,则需要大量内存来在集合中运行循环并检查每个学生的可用字段 另一方面,(双向)如果我对学生执行select子句来检索可用的学生,那么我也会以这种方式检索组类记录(因为它是学生的成员)。因此,对于每个学生,我都在检索其字段+组的字段 样本数据 Group 1 Name available
另一方面,(双向)如果我对学生执行select子句来检索可用的学生,那么我也会以这种方式检索组类记录(因为它是学生的成员)。因此,对于每个学生,我都在检索其字段+组的字段 样本数据
Group 1
Name available
Jack true
Luke false
Nou true
...
Group 2
Name available
Mike false
George false
Alex true
...
预期结果
Name Available Group GroupName
Jack true 1 Wolfs
Nou true 1 Wolfs
Alex true 2 Tigers
@Entity
public class Student {
@Id
@GeneratedValue
private long id;
private String name;
private boolean available;
@OneToOne
private MyGroup group;
getters and setters
}
@Entity
public class MyGroup {
@Id
@GeneratedValue
private long id;
private String name;
@OneToMany
private List<Student> student = new ArrayList();
getters and setters
}
课程
Name Available Group GroupName
Jack true 1 Wolfs
Nou true 1 Wolfs
Alex true 2 Tigers
@Entity
public class Student {
@Id
@GeneratedValue
private long id;
private String name;
private boolean available;
@OneToOne
private MyGroup group;
getters and setters
}
@Entity
public class MyGroup {
@Id
@GeneratedValue
private long id;
private String name;
@OneToMany
private List<Student> student = new ArrayList();
getters and setters
}
@实体
公立班学生{
@身份证
@生成值
私人长id;
私有字符串名称;
私有布尔值可用;
@奥内托内
私人MyGroup集团;
接球手和接球手
}
@实体
公共类MyGroup{
@身份证
@生成值
私人长id;
私有字符串名称;
@独身癖
private List student=new ArrayList();
接球手和接球手
}
在hibernate中默认情况下,延迟加载是真的,因此,如果您在students表上执行select子句并获取students,那么默认情况下,使用一个student对象,您将获取组id作为外键,并且我认为并非关联组对象的所有记录都将立即获取。如果您想要获取students列表稍后您可以这样做,但由于延迟加载与组对象关联的学生列表,因此无法获取atonce。我认为这是您的主要问题。您不希望获取与组对象关联的学生列表。我认为您当前的学生表结构将是这样的
id name group_id
1 jack 1
2 joe 2
3 Mack 1
如果您可以再添加一个可用的布尔字段,那么您的查询可以更具体,就像属于组id的学生一样,并且可以为true
Boolean available
现在,您的学生表结构将如下所示
id name group_id available
1 jack 1 true
2 Joe 2 true
3 Mack 1 false
因此,现在你可以根据可用的布尔字段查询特定的学生集合“如果我对学生执行select子句来检索可用的学生,我可能会多次对组记录执行内部select,因为每个学生记录中都有一个组字段。”什么?@Taylor我已经重新表述了,请告诉我它现在是否可读是的,它可能基于学生和组id的搜索id。如果你使用上面的学生和我的小组的实体,你可能会在正常的形式中被击中。你会在异常数据上得到冗余。你应该检查最小化实体中的冗余数据,这将完善设计。那么你的建议是什么?我没有得到
,因此对于每个学生,我将检索其字段+组的字段。
是,但hibernate仍将为每个组生成一个组实例。要澄清的是someStudentInGroup1.getGroup()==someOtherStudentInGroup1.getGroup()
添加可用字段是什么意思?我的学生课上有这个字段,我想一次检索组中的所有学生记录,我刚刚记得,由于设置太慢,无法始终检索组,但还有一个问题是冗余,我需要解决。@J888您仅基于可用字段或基于可用字段和组进行检索。如果您同时基于这两个字段进行查询,则u将无法获取我所需的冗余数据要列出所有可用字段的学生的列表是正确的(但我需要知道他们属于哪个组,所以我也需要检索这些组),刚才我提供了预期的结果,在问题中。如果你将组作为学生类的成员,那么它将在级联操作中帮助你。我认为如果你从学生类查询,那么它将是更高效的内存查询,因为如果你从group查询,那么你将不得不对学生列表进行迭代并检查其可用性。下面是一个例子链接的关系和你的一样。所以我认为如果你的关系是双向的,这是可以的