【问题标题】:jpa query join fetch from a onetomanyjpa query join fetch from onetomany
【发布时间】:2016-03-10 12:08:37
【问题描述】:

我有以下 2 个使用带有 openjpa 和 derby 嵌入式数据库的 JTA 事务类型的类。当我只有 WSpace id 时,我想要的是在一个查询中获取父组织和请求的 WSpace。我对 JPA 很陌生,所以我边走边学,一直在努力处理“q2”查询。我一直在使用查询“q0”和“q1”来调试和检查数据库中确实存在的项目。 'q0' 和 'q1' 返回 1 个对象,而 'q2' 返回 0 个对象

我尝试了各种实体设置和不同的查询,但没有任何效果。

最初,WSpace 类没有 Organization 字段,因为它似乎不需要持久化或选择,但我添加了它(连同 mappedby 参数),以防查询工作需要它,但没有任何改变.

回到最初的问题,我怎样才能让它工作,以便它返回父对象,并请求单个子对象

SELECT o FROM Organisation o JOIN FETCH o.spaces w WHERE w.id = :id

这是我的课程

@Entity
public class Organisation implements MyObjects
{
    @Id
    @NotNull
    private Integer id;
    private String name;
    @OneToMany( mappedBy = "organisation",
        cascade = { CascadeType.PERSIST, CascadeType.MERGE } )
    private List<WSpace> spaces;

    //getters/setter below
}

And

@Entity
public class WSpace implements MyObjects
{
    @Id
    @NotNull
    private Integer id;
    private String name;
    @ManyToOne
    private Organisation organisation;
    @OneToMany
    private List<Application> apps;

    //getters/setter below
}

class DAO
{
    ...

    public void foo( Integer id )
    {
        ....
        String q0 = "SELECT o FROM Organisation o WHERE o.id = 49068";
        List<Organisation> res0 = em.createQuery( q0, Organisation.class ).getResultList();
        String q1 = "SELECT w FROM WSpace w WHERE w.id = " + id;
        List<WSpace> res1 = em.createQuery( q1, WSpace.class ).getResultList();
        String q2 = "SELECT o FROM Organisation o "
                + "JOIN FETCH o.spaces w WHERE w.id = " + id;
        List<Organisation> res2 = em.createQuery( q2, Organisation.class ).getResultList();
        ...
    }
}

【问题讨论】:

  • 在@ManyToOne 下使用@JoinColumn("column_name")
  • 没有区别,我还尝试删除 ManyToOne 反向引用并使用仍返回 0 的 JoinTable。我开始怀疑这是不可能的
  • 现在我将保留 ManyToOne 的反向引用并调用 SELECT w FROM WSpace w WHERE w.id = :id 从 WSpace 获取组织。

标签: java jpa


【解决方案1】:

您是否尝试在日志中查找您的 q2 查询的输出? 我也在学习 JPA,最近正在处理 Criteria 和 QL 查询。 因此,在遇到几乎相同的连接问题后,我开始检查日志,并且很清楚问题是什么,因为日志显示为转换为 SQL 查询。 另一件事是,你是如何生成你的实体的?我使用 Netbeans 为我生成它。此外,多对多关系也生成了辅助类,我在其中一个项目中看到了它。 希望对你有帮助。。

【讨论】:

  • 日志存储在哪里?没有任何东西被推送到命令行?
  • 在我的情况下,我对所有 CRUD 方法进行了单元测试,因此 JPA 发出的 SQL 查询被输出到控制台(如果我没记错的话,或者到 Glassfish 服务器日志中)在你的情况下,你可以看看这个帖子stackoverflow.com/a/4367283或这个stackoverflow.com/a/5129495登录IDE输出窗口
【解决方案2】:

您要查找的查询可能是这样的:

SELECT w FROM WSpace w LEFT JOIN FETCH w.organisation where w.id=:id

使用query.setParameter("id", id); 将id 参数绑定到查询。这有效地告诉持久性提供程序在同一查询中查询WSpace 实体时获取WSpace.organisation 关系。在JOIN FETCH 关键字前面使用LEFT [OUTER] 关键字(OUTER 是可选的)告诉您的持久性提供程序选择WSpace 对象,即使您的WSpace.organisation 关系没有匹配的Organisation 记录。

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2011-08-14
    • 2014-08-28
    相关资源
    最近更新 更多