Java 休眠不获取子实体(如果不存在)

Java 休眠不获取子实体(如果不存在),java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我们拥有以下域: 成员和渠道 成员-相当于用户 @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "first_name") private String firstName; } 频道-将博客文章按主题分组 @Ent

我们拥有以下域: 成员和渠道

成员-相当于用户

@Entity
@Table(name = "member")
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "first_name")
    private String firstName;

}
频道-将博客文章按主题分组

@Entity
@Table(name = "channel")
public class Channel {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

}
成员可以分配到频道,从而成为频道中的成员。所以我们有ChannelMember实体,因为我们并不总是想要检索关系的两端

@Entity
@Table(name = "channel_member")
public class ChannelMember {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne
    @JoinColumn(name = "channel_id", nullable = false)
    private Channel channel;

    @OneToOne
    @JoinColumn(name = "member_id", nullable = false)
    private Member member;
}
我们使用Spring数据JPA和MySQL进行持久化(Spring Boot 1.5.3版本)

为什么Hibernate的JPQL查询中必须使用distinct才能在以下情况下获取任何记录

存储库代码示例如下:

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
    @Query("select cm.member from ChannelMember cm")
    List<Member> getNotWorking(); // empty List will be returned

    @Query("select distinct cm.member from ChannelMember cm")
    List<Member> getWorking();
}
@存储库
公共接口MemberRepository扩展了JpaRepository{
@查询(“从ChannelMember cm中选择cm.member”)
List getNotWorking();//将返回空列表
@查询(“从ChannelMember cm中选择不同的cm.member”)
列出getWorking();
}

你不工作是什么意思。任何异常或空输出?查询结果将是一个空列表。是否尝试在ChannelMember存储库中移动此方法?我认为它需要distinct,因为同一成员可以属于多个通道,因此如果没有“distinct”,它将不得不在结果列表中包含同一成员的多个副本。另一个选项:确保此方法返回一个集合,并确保为成员正确实现.equals()和hashCode()。@MátéLáng是否有机会使用
p6spy
查看实际SQL?…或使用
hibernate.show_SQL=true
(在适当的情况下)。实际的SQL可以提供线索!