联接表中的 JPQL 查询

Posted

技术标签:

【中文标题】联接表中的 JPQL 查询【英文标题】:JPQL query in joined tables 【发布时间】:2018-09-04 23:31:57 【问题描述】:

我的问题很简单,虽然我找到了多种解决方案,但我没有成功正确实施它们,所以我请求你的帮助。

在一个名为 Prof 的实体类中,我有这个:

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer idUser;
    @OneToMany (cascade = PERSIST)
    @JoinTable(name="jnt_Prof_Exam",
                joinColumns = @JoinColumn(name="idUser"), 
                inverseJoinColumns = @JoinColumn(name="idExam"))
        private List<Exam> exams;

现在我想知道如何获取给定 idUser 的 Exam 列表

【问题讨论】:

【参考方案1】:

你可以使用这个JPQL,

SELECT p.exams FROM Prof p WHERE p.idUser = :id

调用会是这样的:

List<Exam> exams = em.createQuery("...JPQL...")
     .setParameter("id", idUser)
     .getSingleResult();

使用此 JPQL 只会获取 exams 的列表,而不是 Prof 类中的所有对象。

更好的是,您可以将 JPQL 与 NamedQuery 一起使用,但这样您可以快速进行测试。 :)

【讨论】:

非常感谢,我还有一个问题,如果我想更新 List ,我的意思是我想在给定 idUser 的属性“exams”中添加一项,你能帮我吗? :) 我建议您创建新的考试对象并使用 em.persist(exam) 将其持久化,如果是您的用例,请在持久化之后进行此 jpa 查询。 但是如果我坚持考试对象,它只会被添加到考试表中,换句话说,考试和教授之间不会有任何联系,我的意思是不会在加入的内容中添加任何内容表。 一旦您再次查询以获取考试,您将获得所有考试信息。我不知道你的用例,也许,如果我更了解它,我可以为你提供更多帮助。【参考方案2】:

您也可以像这样使用 em.find()

EntityManager em;
List<Exam> exams= new ArrayList<>( em.find( Prof.class, givenID ).getExams() );

【讨论】:

是的,这是事实,但是find() 方法会进行多个查询,它会填充一个对象Prof,然后执行相关查询以获得exams信息

以上是关于联接表中的 JPQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

优化按联接表中的字段对结果进行分组的查询

如何在单个查询中使用联接和聚合函数更新表中的多行

使用内部联接更新多个表中的列

带有内部联接的 SQL 更新查询语法

SQL试图在子查询中使用联接表中的列

查询中的七个内部联接是不是太多?