【问题标题】:Spring many to many select春天多对多选择
【发布时间】:2017-05-27 12:55:59
【问题描述】:
public class User {
    @ManyToMany(mappedBy = "speakers")
    private List<Event> speakerEvents;
}

public class Event {
    @ManyToMany
    @JoinTable(name = "user_speaker_event",
            joinColumns = {@JoinColumn(name = "event_id")},
            inverseJoinColumns = {@JoinColumn(name = "calendar_user_id")})
    private List<User> speakers;
}

我想选择所有发言者 => 我需要所有用户的 spekaerEvents 不为空。

我正在使用 Spring Data,并尝试使用方法来用户存储库,但它不起作用。

它返回所有扬声器,但扬声器重复(因此会有 5 次 User1,5 次 User2 等)

public interface UserRepository extends JpaRepository<User, Long> {    
    List<User> getBySpeakerEventsIsNotNull();
}

我知道我可以使用@Query 注释来选择需要的用户,但我无法弄清楚(查询本身)。

我有类似的东西,但它的工作方式相同。我觉得我需要在某处添加 DISTINCT,但不知道如何。

SELECT * 
FROM public.calendar_users
INNER JOIN user_speaker_event ON calendar_users.id = user_speaker_event.calendar_user_id

【问题讨论】:

  • 1.意识到 Query 需要 JPQL 而不是 SQL 查询。 2.意识到JPQL和JPQL不是一回事,值得学习,就像你曾经学过SQL一样。 3. 打开hibernate手册,在文档中查找JPQL章节(阅读整本手册也可以)。 4. 阅读本章,如果需要,读两遍或三次。 5. 您现在应该至少可以尝试 JPQL 查询,选择不同的用户。请注意,顺便说一句,任何演讲者都不会拥有空的事件集合。集合可能为空,但不为空。

标签: java mysql sql spring spring-data-jpa


【解决方案1】:

好吧,我想通了。

@Query("select u from User u where u.speakerEvents.size <> 0")

我的主要问题是对 jpql 和 sql 的理解也不好。
但是这个想法在这里也“帮助”了我一点。没有为 JPA 安装 facet,它只是不想使用 speakerEvents.size,所以我认为它不受支持。此外,它试图获取数据库用户,而不是我的应用程序用户 => 有更多错误。当我在调试中看到 userName "postgres" 时,我终于明白那里发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多