簡體   English   中英

在Hibernate中查詢組合表

[英]Querying composite table in Hibernate

我正在一個Spring-MVC應用程序上工作,該應用程序具有多對多關系,必須在2個表中查詢以獲得所需的值。 我將更詳細地解釋。

  • 我有2個表GroupAccount,具有多對多關系的GroupMembers。 現在有一個名為membertable的聯結表,其中存儲了GroupMembers和GroupAccount的ID。

這是我正在尋找的:

  • 我將groupAccounId和用戶名作為參數傳遞。 現在,在GroupMembers表中,存儲了一個用戶名。 在groupAccount中,存儲了groupAccountId。
  • 現在在memberjunction中,我有復合鍵memberid,GroupAccountId,我想要具有提交的匹配groupAccountId的用戶名的成員ID。

下面是對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:#

 @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模型:

@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模型類:

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

你能幫忙的話,我會很高興。 非常感謝。

這是join和HQL的文檔 請閱讀。

查詢非常簡單

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

還請修正您的命名。 GroupMembers實例是單個組成員。 因此,該類應命名為GroupMember ,不帶s 重復此類的字段的類的名稱也是冗余: member.getId()是更好的可讀性和小於冗長member.getMemberId() 其他字段也一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM