我有实体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();
}

10-06 13:48