我有以下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();
...
}
}
答案 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
个对象,即使没有匹配的Organisation
您WSpace.organisation
关系的记录。