Hibernate Если результат 'left join fetch' @Manytoone равен нулю, выберите его снова

Я перепробовал много. Но причина не может быть найдена. Мне нужна ваша помощь

CardNews Entity

@Entity
@Table(name = "card_news", schema = "pikeul", indexes = @Index(name = "IDX_CARD_NEWS_1", columnList = "user_seq, reg_date"))
public class CardNews implements Serializable {

    private static final long serialVersionUID = 8912318097356401738L;

    @Id
    @Column(name = "card_seq", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long cardSeq; 

    @Column(name = "user_seq", nullable = false)
    private long userSeq; 

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_seq", referencedColumnName = "user_seq", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none"))
    private User user;

    @Fetch(FetchMode.SELECT)
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumns(value = {
            @JoinColumn(name = "card_seq", referencedColumnName = "card_seq", insertable = false, updatable = false),
            @JoinColumn(name = "user_seq", referencedColumnName = "user_seq", insertable = false, updatable = false)
    }, foreignKey = @ForeignKey(name = "none"))
    private LikeCard likeCard = new LikeCard(); 

    // Getter & Setter 
}

CardLike Entity

@Entity
@Table(name = "card_like", schema = "pikeul")
public class LikeCard implements Serializable {

    @EmbeddedId
    private LikeCardPk pk;

    public LikeCard(){
        this.pk = new LikeCardPk(0, 0);
    }

    public LikeCard(LikeCardPk pk) {
        this.pk = pk;
    }

    public LikeCardPk getPk() {
        return pk;
    }

    public void setPk(LikeCardPk pk) {
        this.pk = pk;
    }


}

Spring Data JPA Query Case-1

@EntityGraph(attributePaths = {"user", "likeCard"})
    @Query( "SELECT card  FROM CardNews card " +
            "JOIN card.user user ON user.useYn = true " +
            "LEFT JOIN card.likeCard likeCard ON likeCard.pk.userSeq = ?#{principal.user.userSeq ?: '0'} " +
            "WHERE card.cardSeq = :cardSeq AND card.useYn = true")

Spring Data JPA Query Case-2

@Query( "SELECT card, user, likeCard FROM CardNews card " +
            "JOIN card.user user ON user.useYn = true " +
            "LEFT JOIN card.likeCard likeCard ON likeCard.pk.userSeq = ?#{principal.user.userSeq ?: '0'} " +
            "WHERE card.cardSeq = :cardSeq AND card.useYn = true")

Проблема заключается в следующем. При запросе сущности CardLike через ManyToOne в сущности CardNews сущность CardLike существует или не существует.

CardLike может быть нулевым при получении данных через левое соединение при выполнении Query для Case1 и Case2.

Посмотрите на журнал.

Hibernate: 
    select
        cardnews0_.card_seq as card_seq1_5_0_,
        user1_.user_seq as user_seq1_12_1_,
        likecard2_.card_seq as card_seq1_4_2_,
        likecard2_.user_seq as user_seq2_4_2_,
        cardnews0_.contents as contents2_5_0_,
        cardnews0_.game_type as game_typ3_5_0_,
        cardnews0_.hash_tag as hash_tag4_5_0_,
        cardnews0_.user_seq as user_seq8_5_0_,
        cardnews0_.like_count as like_cou5_5_0_,
        cardnews0_.reg_date as reg_date6_5_0_,
        cardnews0_.use_yn as use_yn7_5_0_,
        user1_.agree_date as agree_da2_12_1_,
        user1_.agree_yn as agree_yn3_12_1_,
        user1_.email as email4_12_1_,
        user1_.mod_date as mod_date5_12_1_,
        user1_.nickname as nickname6_12_1_,
        user1_.night_push_yn as night_pu7_12_1_,
        user1_.profile_image as profile_8_12_1_,
        user1_.provider as provider9_12_1_,
        user1_.provider_id as provide10_12_1_,
        user1_.push_date as push_da11_12_1_,
        user1_.push_yn as push_yn12_12_1_,
        user1_.reg_date as reg_dat13_12_1_,
        user1_.thumbnail_image as thumbna14_12_1_,
        user1_.use_yn as use_yn15_12_1_ 
    from
        card_news cardnews0_ 
    inner join
        enter_user user1_ 
            on cardnews0_.user_seq=user1_.user_seq 
            and (
                user1_.use_yn='Y'
            ) 
    left outer join
        card_like likecard2_ 
            on cardnews0_.card_seq=likecard2_.card_seq 
            and cardnews0_.user_seq=likecard2_.user_seq 
            and (
                likecard2_.user_seq=?
            ) 
    where
        cardnews0_.card_seq=? 
        and cardnews0_.use_yn='Y'



Hibernate: 
    select
        likecard0_.card_seq as card_seq1_4_0_,
        likecard0_.user_seq as user_seq2_4_0_ 
    from
        card_like likecard0_ 
    where
        likecard0_.card_seq=? 
        and likecard0_.user_seq=?

Как указано выше, если данные извлекаются с помощью левого соединения, но CardLike Entity не существует, вы можете просмотреть журнал, чтобы выбрать его снова.

Если это результат списка, выберите 1 + N.

Я пытался понизить рейтинг, но результат был тот же

Среда разработки выглядит следующим образом: Spring 5.0.4, Spring-Data-JPA 2.0.4, Hibernate 5.2.13.

0 ответов

Другие вопросы по тегам