在Hibernate中查询复合表

在Hibernate中查询复合表,hibernate,postgresql,spring-mvc,Hibernate,Postgresql,Spring Mvc,我正在开发一个SpringMVC应用程序,在这个应用程序中,我有一个多对多关系,在这个关系中,我必须在两个表中进行查询,以获得我需要的值。我会详细解释 我有两个表GroupAccount,GroupMembers与多对多 关系现在有一个名为membertable的连接表 存储来自GroupMembers和GroupAccount的id 这就是我想要的: 我将GroupMember用户名作为参数传递,并且我有一个 GroupMemberId与我在一起(这是我当前所在的位置) 现在,如何在ju

我正在开发一个SpringMVC应用程序,在这个应用程序中,我有一个多对多关系,在这个关系中,我必须在两个表中进行查询,以获得我需要的值。我会详细解释

  • 我有两个表GroupAccount,GroupMembers与多对多 关系现在有一个名为membertable的连接表 存储来自GroupMembers和GroupAccount的id
这就是我想要的:

  • 我将GroupMember用户名作为参数传递,并且我有一个 GroupMemberId与我在一起(这是我当前所在的位置)
  • 现在,如何在junctiontable中搜索,并获取所有 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;
    }
@覆盖
public List returnMemberIdWithMatchingUsername(字符串memberUsername){
session=this.sessionFactory.getCurrentSession();
org.hibernate.Query Query=session.createQuery(“来自GroupMembers as”+
“n其中n.memberUsername=:memberUsername”);
query.setParameter(“memberUsername”,memberUsername);
List memberList=query.List();
List memberIdList=新建ArrayList();
对于(组成员:成员列表){
添加(members.getMemberid());
}
返回成员列表;
}
现在我有了memberIdList,我只想检查MemberJunction中memberIdList匹配的每个值。任何帮助都很好。请注意,我没有任何单独的memberjunction类。非常感谢。:-)

拉梅什:

GroupAccount模型类:

@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;
    }
}
@实体
@表(name=“groupaccount”)
公共类组帐户{
@身份证
@列(name=“groupid”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“groupaccount\u seq\u gen”)
@SequenceGenerator(name=“groupaccount\u seq\u gen”,sequenceName=“groupaccount\u seq”)
私有长groupId;
@多个(级联=级联类型.ALL)
@JoinTable(name=“memberjunction”,joinColumns={@JoinColumn(name=“groupid”)},
inverseJoinColumns={@JoinColumn(name=“memberid”)}
私有集groupMembersSet=newhashset();
公共无效集合groupMembersSet(集合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;
    }
}
@实体
@表(name=“groupmembers”)
公共类组成员{
@身份证
@列(name=“memberid”)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“groupmembers\u seq\u gen”)
@SequenceGenerator(name=“groupmembers\u seq\u gen”,sequenceName=“groupmembers\u seq”)
私有内部成员ID;
@ManyToMany(mappedBy=“groupMembersSet”)
private Set groupAccounts=new HashSet();
公共作废setGroupAccounts(设置groupAccounts){
this.groupAccounts=groupAccounts;
}
公共集getGroupAccounts(){
返回此.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;
}

希望能有帮助。如果您对这些查询有任何疑问,请更新我

您是否可以发布实体类(GroupAccount和groupMember)here@Ramesh:是的,我正在编辑帖子以添加类。谢谢您的回复。:-)@拉梅什:我已经添加了模型类,现在我可以添加组帐户、添加组成员等。但是我必须根据memberId查找组帐户。这是为了获取关于一个成员加入了多少组的信息。不,我想要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;
}