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.