【发布时间】: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 获取组织。