我有2个实体A和B. A有2个属性类型B我想在选择连接中获取它们而不是它们声明它们EAGER并进行多次选择。
class A{
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="b1_Id")
private B bproperty1;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="b2_Id")
private B bproperty2;
}
jpql select就像这样:
List<A> result=entityManager.createQuery("SELECT a"
+ "FROM A a "
+ "LEFT JOIN a.bproperty1 b1 "
+ "LEFT JOIN vs.bproperty2 b2 ").getResultList();
执行查询bproperty1后,bproperty2变为null但是如果我将查询更改为:
List<Object[]> result=entityManager.createQuery("SELECT a,b1,b2"
+ "FROM A a "
+ "LEFT JOIN a.bproperty1 b1 "
+ "LEFT JOIN a.bproperty2 b2 ").getResultList();
手动执行分配
for(Object[] a:result){
a[0].property1=a[1];
a[0].property1=a[2];
}
它有效。有一种方法可以强制jpql自动完成并避免锅炉板分配部分。我需要做的一些连接很大,如果可能的话我想避免容易出错的锅炉板分配部分
编辑1.0
我发现在第二个查询中我得到了property1和2自动分配,但我为它们选择了额外的行。我的错误没有多行
从第一个jpql语句生成的SQL查询
select a.b1_Id,a.b2_Id
from A a
left outer join B b1 on a.b1_Id=b1.Id
left outer join B b2 on a.b2_Id=b2.Id
编辑2.0 添加了真实的查询
Query query = entityManager.createQuery("SELECT vs "
+ "FROM VitalSigns vs "
+ "LEFT JOIN vs.oxygenDeliverySystem "
+ "LEFT JOIN vs.levelOfConsciousness "
+ "LEFT JOIN vs.sbar "
+ "LEFT JOIN vs.heartRhythm "
+ "LEFT JOIN vs.vitalSignsBoundary "
+ "LEFT JOIN vs.fluidBalance "
+ "LEFT JOIN vs.vitalSignsBoundary "
+ "LEFT JOIN vs.createdby "
+ "WHERE vs.id=:id");
query.setParameter("id", id);
List<VitalSigns> result =(List<VitalSigns>)query.getResultList();
答案 0 :(得分:-1)
解决方案的排序:此查询完成工作,不为连接获取额外的行,初始化属性bproperty1和bproperty2。无法摆脱锅炉板代码但显着降低了它
List<Object[]> result=entityManager.createQuery("SELECT a,b1,b2"
+ "FROM A a "
+ "LEFT JOIN a.bproperty1 b1 "
+ "LEFT JOIN a.bproperty2 b2 ").getResultList();
List<Object[]> result =(List<Object[]>)query.getResultList();
List<A> aList = new ArrayList<A>();
for(Object[] a:results){
aList.add((A)a[0]);
}