简体   繁体   English

在Hibernate中查询组合表

[英]Querying composite table in Hibernate

I am working on a Spring-MVC application where I have a many-to-many relationship in which I have to query in 2 tables to get the values I require. 我正在一个Spring-MVC应用程序上工作,该应用程序具有多对多关系,必须在2个表中查询以获得所需的值。 I will explain in more detail. 我将更详细地解释。

  • I have 2 tables GroupAccount, GroupMembers with many-to-many relationship. 我有2个表GroupAccount,具有多对多关系的GroupMembers。 Now there is a junction table called membertable where id from GroupMembers and GroupAccount is stored. 现在有一个名为membertable的联结表,其中存储了GroupMembers和GroupAccount的ID。

This is what I am looking for : 这是我正在寻找的:

  • I pass a groupAccounId and username as parameters. 我将groupAccounId和用户名作为参数传递。 Now, in the GroupMembers table, there is a username stored. 现在,在GroupMembers表中,存储了一个用户名。 In groupAccount, there is groupAccountId is stored. 在groupAccount中,存储了groupAccountId。
  • Now in the memberjunction, I have composite key memberid,GroupAccountId, I would like the member id for the username which has a matching groupAccountId I submit. 现在在memberjunction中,我有复合键memberid,GroupAccountId,我想要具有提交的匹配groupAccountId的用户名的成员ID。

Below is the SQL code and Spring-mvc code to understand more better. 下面是对SQL代码和Spring-mvc代码的更好的理解。

CREATE TABLE public.groupaccount (
                groupid NUMERIC NOT NULL,
                groupname VARCHAR,

                groupaccountstatus BOOLEAN DEFAULT false NOT NULL,
                adminusername VARCHAR,
                CONSTRAINT groupid PRIMARY KEY (groupid)
);

CREATE TABLE public.groupmembers (
                memberid INTEGER NOT NULL,
                musername VARCHAR
                CONSTRAINT memberid PRIMARY KEY (memberid)
);
CREATE TABLE public.memberjunction (
                memberid INTEGER NOT NULL,
                groupid NUMERIC NOT NULL,
                CONSTRAINT membergroupid PRIMARY KEY (memberid, groupid)
);

GroupMembersDAOImpl :# GroupMembersDAOImpl:#

 @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;
    }

GroupAccount model : 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;
    }
}

GroupMembers model class : GroupMembers模型类:

@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;
    }
}

Query I am using : 查询我正在使用:

 @Override
    public int getMemberIdForCanvas(String memberUsername, Long groupId) {
        session = this.sessionFactory.getCurrentSession();
        org.hibernate.Query query = session.createQuery("select distinct m.memberId from GroupMembers m\n" +
                "join m.groupAccounts a\n" +
                "where a.memberUsername = :userName and m.groupId=:groupId");

        query.setParameter(memberUsername,"memberUsername");
        query.setParameter(String.valueOf(groupId),"groupId");
        int memberid = (Integer)query.uniqueResult();
        return memberid;
    }

Any help would be nice. 你能帮忙的话,我会很高兴。 Thanks a lot. 非常感谢。

Here's the documentation for joins and HQL . 这是join和HQL的文档 Please read it. 请阅读。

The query is as simple as 查询非常简单

select distinct m.memberId from GroupMembers m
join m.groupAccounts a
where a.memberUsername = :userName

Please also fix your naming. 还请修正您的命名。 A GroupMembers instance is a single group member. GroupMembers实例是单个组成员。 So the class should be named GroupMember , without s . 因此,该类应命名为GroupMember ,不带s Repeating the name of the class in the fields of this class is also redundant: member.getId() is more readable and less verbose than member.getMemberId() . 重复此类的字段的类的名称也是冗余: member.getId()是更好的可读性和小于冗长member.getMemberId() Same for the other fields. 其他字段也一样。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM