2017-05-27 57 views
0
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的数据,并试图与法用户库,但它不工作。

它返回所有的音箱,但音箱复制(所以会出现5次用户1,5次用户2等)

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 
+0

1.注意,查询需要一个JPQL,而不是一个SQL查询。 2.认识到JPQL与JPQL不同,值得学习,就像你学过SQL一样。 3.打开hibernate手册,在文档中查找JPQL章节(阅读整本手册也是一个好主意)。 4.如果需要,阅读本章,两次或三次。 5.您现在应该至少可以尝试JPQL查询,选择不同的用户。请注意,顺便说一句,没有发言者会收到事件的空集。该集合可能为空,但不为空。 –

回答

0

好吧,我想通了。

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

我的主要问题是对jpql和sql的理解太差。
但是这个想法“也帮助了我”。 JPA没有安装方面,它只是不想使用speakerEvents.size,所以我不支持它。还有,它试图把数据库用户,而不是我的应用程序用户=>有更多的错误。当我在调试中看到userName“postgres”时,我终于明白发生了什么。