jpa查询连接从onetomany获取

时间:2016-03-10 12:08:38

标签: java jpa

我有以下2个类使用JTA事务类型与openjpa&德比嵌入式数据库。我想要的是获得母组织&当我只有WSpace id时,在一个查询中请求的WSpace。我对JPA很陌生,所以我正在学习,并且一直在努力学习' q2'查询。我一直在使用查询' q0' &安培; ' Q1'调试并检查数据库中是否存在项目。 ' Q0'像' q1'那样返回1个对象,而' q2'返回0个对象

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

对于WSpace类来说,它没有一个“组织”字段,因为它似乎没有必要进行持久化或选择,但我添加了它(以及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();
        ...
    }
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您正在寻找的查询可能就是:

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

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