我有实体Post,PostDetail。
这些是一对一的关系,PostDetail是可选的。
class Post {
@Id
private int id;
@Column
private String title;
@Column
private Strint contents;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private PostDetail postDetail;
}
class PostDetail {
@Id
private int id;
@Column
private boolean duplicated;
@OneToOne
private Post post;
}
public interface PostRepository extends JpaRepository<Post, Integer> {
@Transactional
@Query("SELECT a FROM Post a LEFT JOIN FETCH a.postDetail")
public Page<Post> getAll(Example<Post> example, Pageable pageable);
@Transactional
@Query("SELECT a FROM Post a LEFT JOIN FETCH a.postDetail")
public List<Post> getAll();
}
应用程序启动时,发生异常。
由以下原因引起:org.hibernate.QueryException:查询指定了联接获取,但是选择列表中不存在所获取的关联的所有者...
问题是什么?我正在尝试这样做,以避免在查询帖子列表(getAll())时出现N + 1问题。
抱歉,我修改了我的问题。
两个PostRepository的方法都出错。
首先getAll()引发错误“查询指定的联接正在获取...”
第二个getAll()引发错误
org.mariadb.jdbc.internal.common.QueryException:“字段列表”中的未知列“ postdetail1_.post_id”
最佳答案
如果要避免出现1 + N个查询问题,可以使用EntityGraph。只需在自定义Repo中覆盖'findAll'方法并在其上使用EntityGraph批注,如下所示:
public interface PostRepository extends JpaRepository<Post, Integer> {
@Override
@EntityGraph(attributePaths = {"postDetail"})
Page<Post> findAll(Pageable pageable);
@Override
@EntityGraph(attributePaths = {"postDetail"})
List<Post> findAll();
}