【问题标题】:How to get all elements not present in a @ManyToMany Relationship如何获取@ManyToMany关系中不存在的所有元素
【发布时间】:2022-01-20 16:21:57
【问题描述】:

我正在尝试获取 UserAccount 不存在于管理员或关注者中的所有频道(-> 不在 subscribedUsers 和管理员集合中)。

这些是我的实体:

public class UserAccount {
    @Id ... 
    private long userId;
    
    @JsonIgnore
    @JoinTable(
      name="user_channel_sub",
      joinColumns = @JoinColumn(name                 
            ="user_channel_id",referencedColumnName="userId"),
        inverseJoinColumns = @JoinColumn(name =              
            "channel_user_id",referencedColumnName = "channelId"))
    @ManyToMany
    private Collection<Channel> subChannel = new ArrayList<Channel>();

    @JoinTable(
            name="user_channel_admin",
            joinColumns = @JoinColumn(name = 
                "user_channel_id",referencedColumnName= "userId"),
            inverseJoinColumns = @JoinColumn(name = 
                "channel_user_id",referencedColumnName = "channelId"))
    @ManyToMany
    private Collection<Channel> adminChannel = new ArrayList<Channel>();

    ....
}
public class Channel {
    @Id
    private channelId;

    @ManyToMany(mappedBy="adminChannel")
    private Collection<UserAccount> admins  = new ArrayList<UserAccount>();
    
    @ManyToMany(mappedBy = "subChannel")
    private Collection<UserAccount> subscribedUsers  = new ArrayList<UserAccount>();

    ....
}

Repository 是一个 PagingAndSortingRespository。

我通过这种方法获得了用户是关注者或管理员的所有频道(我真的不需要它,只是想确保至少有一些东西有效):

Collection&lt;Channel&gt; findBySubscribedUsers_UserName_OrAdmins_UserName(String uName1,String uName2);

现在当我尝试相反的情况时,我得到了重复的数据,而且基本上是错误的数据:

Collection &lt;Channel&gt; findBySubscribedUsersUserNameNotAndAdminsUserNameNot(String uName1,String uName2);

我做错了什么?是否可以使用这种方法,还是我需要使用更高级的 spring jpa 查询方法?

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa


    【解决方案1】:

    可以使用 JPA 查看文档 https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

    使用findDistinct 方法和notContaining

    Collection<Channel> findDistinctByAdminsNotContainingAndSubscribedUsersNotContaining(UserAccount admin, UserAccount subscribedUser);
    

    【讨论】:

    • 不幸的是,这不起作用。我得到了数据库中的每个频道(至少 3 次),即使用户关注每个频道。
    • @iRelenT 我用防止重复的解决方案更新了我的答案。见类似问题stackoverflow.com/questions/32079084/…
    • 感谢您的帮助,但我只想获取在频道类的这两个列表中没有出现 UserAccount 的频道。我跟踪了数据库中的每个频道,仍然使用您的方法获取了所有频道(我不应该得到任何频道)。现在,在将所有表删除到“清理”mysql 之后,我根本没有得到任何结果。
    • 尚未看到您对初始答案的最后一次编辑。 findDistinctnotContaining 有效!非常感谢。头痛终于结束了:)
    • 不用担心,如果解决了您的问题,请标记答案。
    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2012-02-27
    • 2019-07-20
    相关资源
    最近更新 更多