在 Hibernate 中查询复合 table
Querying a composite table in Hibernate
我正在开发一个 Spring-MVC 应用程序,其中我有一个多对多关系,我必须在 2 table 秒内查询以获得我需要的值。我会更详细地解释。
- 我有 2 tables GroupAccount,GroupMembers 多对多
关系。现在有一个名为 membertable 的联结 table,其中
来自 GroupMembers 和 GroupAccount 的 ID 已存储。
这就是我要找的东西:
- 我将 GroupMember 用户名作为参数传递,并且我有一个列表
GroupMemberId 和我(这是我目前所在的位置)。
- 现在如何在交界处搜索table,并得到所有的
GroupAccountId 值,其中 GroupMemberId 是否匹配?
SQL代码:
CREATE TABLE public.groupaccount (
groupid NUMERIC NOT NULL,
groupname VARCHAR,
adminpassword VARCHAR,
groupaccountstatus BOOLEAN DEFAULT false NOT NULL,
adminusername VARCHAR,
CONSTRAINT groupid PRIMARY KEY (groupid)
);
CREATE TABLE public.groupmembers (
memberid INTEGER NOT NULL,
musername VARCHAR,
mpassword VARCHAR,
memberaccountstatus BOOLEAN DEFAULT false NOT NULL,
currentcanvasid NUMERIC DEFAULT 0 NOT NULL,
CONSTRAINT memberid PRIMARY KEY (memberid)
);
CREATE TABLE public.memberjunction (
memberid INTEGER NOT NULL,
groupid NUMERIC NOT NULL,
CONSTRAINT membergroupid PRIMARY KEY (memberid, groupid)
);
GorupMembersDAOImpl :
@Override
public List<Integer> returnMemberIdWithMatchingUsername(String memberUsername) {
session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("From GroupMembers as " +
"n where n.memberUsername=:memberUsername");
query.setParameter("memberUsername",memberUsername);
List<GroupMembers> memberList = query.list();
List<Integer> memberIdList = new ArrayList<>();
for(GroupMembers members :memberList){
memberIdList.add(members.getMemberid());
}
return memberIdList;
}
现在我有了 memberIdList,我只想检查 MemberJunction 中 memberIdList 匹配的每个值。你能帮忙的话,我会很高兴。请注意,我没有任何单独的 class 用于 memberjunction。非常感谢。 :-)
拉梅什:
GroupAccount 模型class:
@Entity
@Table(name="groupaccount")
public class GroupAccount {
@Id
@Column(name="groupid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "groupaccount_seq_gen")
@SequenceGenerator(name = "groupaccount_seq_gen",sequenceName = "groupaccount_seq")
private Long groupId;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "memberjunction", joinColumns = {@JoinColumn(name = "groupid")},
inverseJoinColumns = {@JoinColumn(name = "memberid")})
private Set<GroupMembers> groupMembersSet = new HashSet<>();
public void setGroupMembersSet(Set<GroupMembers> groupMembersSet){
this.groupMembersSet = groupMembersSet;
}
}
群组成员:
@Entity
@Table(name="groupmembers")
public class GroupMembers {
@Id
@Column(name="memberid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "groupmembers_seq_gen")
@SequenceGenerator(name = "groupmembers_seq_gen",sequenceName = "groupmembers_seq")
private int memberid;
@ManyToMany(mappedBy = "groupMembersSet")
private Set<GroupAccount> groupAccounts = new HashSet<>();
public void setGroupAccounts(Set<GroupAccount> groupAccounts){
this.groupAccounts = groupAccounts;
}
public Set<GroupAccount> getGroupAccounts(){
return this.groupAccounts;
}
}
如果您想要与群组成员关联的群组帐户,您可以使用以下查询。
@Override
public List<GroupAccount> returnMemberIdWithMatchingUsername(String memberUsername) {
session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("Select ga From GroupAccount as " +
"ga INNER JOIN ga.groupMembersSet as gm where gm.memberUsername=:memberUsername");
query.setParameter("memberUsername",memberUsername);
List<GroupAccount> groupAccountList = query.list();
return groupAccountList;
}
如果你想数数你可以试试
@Override
public Integer returnMemberIdWithMatchingUsername(String memberUsername) {
session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("Select count(ga) From GroupAccount as " +
"ga INNER JOIN ga.groupMembersSet as gm where gm.memberUsername=:memberUsername");
query.setParameter("memberUsername",memberUsername);
Integer count = (Integer) query.list().get(0);
return count;
}
希望对您有所帮助。如果您对这些查询有任何疑问,请更新我
我正在开发一个 Spring-MVC 应用程序,其中我有一个多对多关系,我必须在 2 table 秒内查询以获得我需要的值。我会更详细地解释。
- 我有 2 tables GroupAccount,GroupMembers 多对多 关系。现在有一个名为 membertable 的联结 table,其中 来自 GroupMembers 和 GroupAccount 的 ID 已存储。
这就是我要找的东西:
- 我将 GroupMember 用户名作为参数传递,并且我有一个列表 GroupMemberId 和我(这是我目前所在的位置)。
- 现在如何在交界处搜索table,并得到所有的 GroupAccountId 值,其中 GroupMemberId 是否匹配?
SQL代码:
CREATE TABLE public.groupaccount (
groupid NUMERIC NOT NULL,
groupname VARCHAR,
adminpassword VARCHAR,
groupaccountstatus BOOLEAN DEFAULT false NOT NULL,
adminusername VARCHAR,
CONSTRAINT groupid PRIMARY KEY (groupid)
);
CREATE TABLE public.groupmembers (
memberid INTEGER NOT NULL,
musername VARCHAR,
mpassword VARCHAR,
memberaccountstatus BOOLEAN DEFAULT false NOT NULL,
currentcanvasid NUMERIC DEFAULT 0 NOT NULL,
CONSTRAINT memberid PRIMARY KEY (memberid)
);
CREATE TABLE public.memberjunction (
memberid INTEGER NOT NULL,
groupid NUMERIC NOT NULL,
CONSTRAINT membergroupid PRIMARY KEY (memberid, groupid)
);
GorupMembersDAOImpl :
@Override
public List<Integer> returnMemberIdWithMatchingUsername(String memberUsername) {
session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("From GroupMembers as " +
"n where n.memberUsername=:memberUsername");
query.setParameter("memberUsername",memberUsername);
List<GroupMembers> memberList = query.list();
List<Integer> memberIdList = new ArrayList<>();
for(GroupMembers members :memberList){
memberIdList.add(members.getMemberid());
}
return memberIdList;
}
现在我有了 memberIdList,我只想检查 MemberJunction 中 memberIdList 匹配的每个值。你能帮忙的话,我会很高兴。请注意,我没有任何单独的 class 用于 memberjunction。非常感谢。 :-)
拉梅什:
GroupAccount 模型class:
@Entity
@Table(name="groupaccount")
public class GroupAccount {
@Id
@Column(name="groupid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "groupaccount_seq_gen")
@SequenceGenerator(name = "groupaccount_seq_gen",sequenceName = "groupaccount_seq")
private Long groupId;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "memberjunction", joinColumns = {@JoinColumn(name = "groupid")},
inverseJoinColumns = {@JoinColumn(name = "memberid")})
private Set<GroupMembers> groupMembersSet = new HashSet<>();
public void setGroupMembersSet(Set<GroupMembers> groupMembersSet){
this.groupMembersSet = groupMembersSet;
}
}
群组成员:
@Entity
@Table(name="groupmembers")
public class GroupMembers {
@Id
@Column(name="memberid")
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "groupmembers_seq_gen")
@SequenceGenerator(name = "groupmembers_seq_gen",sequenceName = "groupmembers_seq")
private int memberid;
@ManyToMany(mappedBy = "groupMembersSet")
private Set<GroupAccount> groupAccounts = new HashSet<>();
public void setGroupAccounts(Set<GroupAccount> groupAccounts){
this.groupAccounts = groupAccounts;
}
public Set<GroupAccount> getGroupAccounts(){
return this.groupAccounts;
}
}
如果您想要与群组成员关联的群组帐户,您可以使用以下查询。
@Override
public List<GroupAccount> returnMemberIdWithMatchingUsername(String memberUsername) {
session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("Select ga From GroupAccount as " +
"ga INNER JOIN ga.groupMembersSet as gm where gm.memberUsername=:memberUsername");
query.setParameter("memberUsername",memberUsername);
List<GroupAccount> groupAccountList = query.list();
return groupAccountList;
}
如果你想数数你可以试试
@Override
public Integer returnMemberIdWithMatchingUsername(String memberUsername) {
session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("Select count(ga) From GroupAccount as " +
"ga INNER JOIN ga.groupMembersSet as gm where gm.memberUsername=:memberUsername");
query.setParameter("memberUsername",memberUsername);
Integer count = (Integer) query.list().get(0);
return count;
}
希望对您有所帮助。如果您对这些查询有任何疑问,请更新我