【问题标题】:Querying a composite table in Hibernate在 Hibernate 中查询复合表
【发布时间】:2015-03-27 05:40:51
【问题描述】:

我正在开发一个 Spring-MVC 应用程序,其中我有一个多对多关系,我必须在 2 个表中查询以获得我需要的值。我将更详细地解释。

  • 我有 2 个表 GroupAccount,GroupMembers 与多对多 关系。现在有一个名为 membertable 的联结表,其中 存储来自 GroupMembers 和 GroupAccount 的 ID。

这就是我要找的:

  • 我将 GroupMember 用户名作为参数传递,我有一个列表 GroupMemberId 和我在一起(这是我目前所在的位置)。
  • 现在如何在联结表中搜索,并获取所有 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 匹配的每个值。你能帮忙的话,我会很高兴。请注意,我没有任何单独的成员连接类。非常感谢。 :-)

对于拉梅什:

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

小组成员:

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

【问题讨论】:

  • 你可以在这里发布实体类(GroupAccount 和 groupMember)
  • @Ramesh :是的,我正在编辑我的帖子以添加课程。感谢您的回复。 :-)
  • @Ramesh :我已经添加了模型类,现在我可以添加组帐户,添加组成员等。但是我必须根据 memberId 找到 groupAccounts。这是为了获取有关成员加入了多少组的信息。

标签: hibernate postgresql spring-mvc


【解决方案1】:

如果您想要与群组成员关联的群组帐户,您​​可以使用以下查询。

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

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

【讨论】:

  • 不,我想要 groupAccountList,这很有帮助。我将检查您提供的代码并在完成后标记答案。非常感谢... :-)
  • 你能检查一下这个问题吗,类似的:stackoverflow.com/questions/28224039/…
猜你喜欢
  • 2012-03-18
  • 2013-11-16
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多