JPQL 用于单向 OneToMany

Posted

技术标签:

【中文标题】JPQL 用于单向 OneToMany【英文标题】:JPQL for a Unidirectional OneToMany 【发布时间】:2015-07-09 08:16:53 【问题描述】:

我的 Spring 存储库接口方法需要 jpql 查询,以检索给定学期的所有帖子。

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = CascadeType.MERGE)
@JoinTable
(
 name = "semester_post",
 joinColumns = @JoinColumn(name = "semester_id", referencedColumnName = "id"),
 inverseJoinColumns = @JoinColumn(name = "post_id", referencedColumnName = "id", unique = true)
)
private List<PostEntity<?>> posts = new ArrayList<>();

PostEntity 没有对 Semester 的引用,我也不想添加,因为我计划将此 PostEntity 用于 Semester 以外的其他事情。也许我会有另一个类(比如说 Group),它也会有一个 PostEntity 的 OneToMany(就像学期中的那个)

那么,我该如何将这个 SQL 查询写成 JPQL 查询呢?

select * from posts join semester_post on semester_post.post_id = posts.id where semester_post.semester_id = 1;

我的仓库

public interface PostRepository extends JpaRepository<PostEntity, Long> 

String QUERY = "SELECT p FROM PostEntity p ... where semester = :semesterId";

@Query(MY_QUERY)
public List<PostEntity> findBySemesterOrderByModifiedDateDesc(@Param("semesterId") Long semesterId);

【问题讨论】:

【参考方案1】:

将为您提供所需结果的查询是:

SELECT p FROM SemesterEntity s JOIN s.posts p WHERE s.id = :semesterId

此查询使用 JOIN 运算符跨 posts 关系将 SemesterEntity 连接到 PostEntity。通过将两个实体连接在一起,此查询返回与相关 SemesterEntity 关联的所有 PostEntity 实例。

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。 @sina72,当然它回答了这个问题。 OP 询问该 SQL 的 JPQL 是什么,而这正是应该使用的。 单独发布代码不是很有帮助。我缺少解释是否以及为什么这有帮助。无论如何,请原谅我的自动文本评论,它也缺少指导。 我可能应得的......虽然“SELECT p FROM SemesterEntity”当时对我来说根本没有意义。我希望它返回学期而不是帖子。我会尝试记录更多。只有在我浪费了几天时间在我知道可能有一个简单解决方案的事情上之后,我才真正在 SO 上发帖。谢谢。 这样,更好吗? :-)

以上是关于JPQL 用于单向 OneToMany的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 不适用于“会员”实体

用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)

JPA JPQL简介

JPQL语法总结对比原生sql

防止JPQL查询sql注入

SQL Server 数据库中带有 Group by 子句的 JPQL 不起作用