Si vous définissez plusieurs @ OneToMany '' dans JPA et essayez de récupérer les deux avec join fetch '', l'exception d'exécution suivante peut se produire.
Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags: [jpa.sample2.Tweet.reTweets, jpa.sample2.Tweet.favorites]
	at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:76) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
	at org.hibernate.loader.hql.QueryLoader.<init>(QueryLoader.java:110) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
Comme schéma d'explication, supposons une table de plusieurs ReTweets et de plusieurs Favoris dans un tweet. L'entité de java est la suivante.
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Data
public class Tweet {
	@Id
	Long id;
	String value;
	@OneToMany
	@JoinColumn(name = "tweetId")
	List<ReTweet> reTweets;
	@OneToMany
	@JoinColumn(name = "tweetId")
	List<Favorite> favorites;
}
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Data
public class ReTweet {
	@Id
	Long id;
	Long tweetId;
	String value;
}
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Data
public class Favorite {
	@Id
	Long id;
	Long tweetId;
	String value;
}
JPQL utilise `` join fetch '' deux fois comme suit.
@Repository
public interface TweetRepository extends JpaRepository<Tweet, Long>  {	
	@Query("select distinct t from Tweet t "
			+ " left join fetch t.reTweets "
			+ " left join fetch t.favorites"
			+ " order by t.id")
	List<Tweet> list2();
}
Cela entraînera l'exception d'exécution ci-dessus.
Dans ce cas, remplacez Liste '' par Définir ''.
	@OneToMany
	@JoinColumn(name = "tweetId")
	Set<ReTweet> reTweets;
	@OneToMany
	@JoinColumn(name = "tweetId")
	Set<Favorite> favorites;
Ou cela peut être `` Carte ''.
	@OneToMany
	@JoinColumn(name = "tweetId")
	Map<Long, ReTweet> reTweets;
	@OneToMany
	@JoinColumn(name = "tweetId")
	Map<Long, Favorite> favorites;
Alternativement, il est possible d'abandonner un seul JPQL et de le diviser en plusieurs parties.
	@Query("select distinct t from Tweet t "
			+ " left join fetch t.reTweets "
			+ " order by t.id")
	List<Tweet> list3();
	
	@Query("select distinct t from Tweet t "
			+ " left join fetch t.favorites"
			+ " order by t.id")
	List<Tweet> list4();
        Recommended Posts