【发布时间】:2017-06-24 12:42:25
【问题描述】:
我有实体 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:查询指定连接提取,但提取关联的所有者不在选择列表中...
有什么问题?我正在尝试这样做以避免在查询帖子列表时出现 N+1 问题 (getAll())。
抱歉,我修改了我的问题。
两个 PostRepository 的方法都会出错。
first getAll() 抛出错误“query specified join fetching ...”
第二个 getAll() 抛出错误
org.mariadb.jdbc.internal.common.QueryException:“字段列表”中的未知列“postdetail1_.post_id”
【问题讨论】:
-
这对我来说看起来不错(除了无用的 Transactional 注释)。我的猜测是例外是关于另一个查询。发布完整的堆栈跟踪。
-
很奇怪。获取的关联的所有者显然 出现在选择列表中。
@PrimaryKeyJoinColumn可能有问题,如果您删除注释,代码是否有效?一种解决方法是使用 hibernate 的@Fetch注释声明默认获取策略并完全删除JOIN FETCH -
我修改了问题。
标签: java spring spring-data-jpa jpql