JPQL左加入自动属性分配

时间:2016-10-05 17:06:09

标签: java sql hibernate jpa jpql

我有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();

1 个答案:

答案 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]);
}