[英]Querying composite table in Hibernate
我正在一個Spring-MVC應用程序上工作,該應用程序具有多對多關系,必須在2個表中查詢以獲得所需的值。 我將更詳細地解釋。
這是我正在尋找的:
下面是對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.