jpa / hibernate条件查询with treat和join on downcasted entity

时间:2017-06-13 09:55:28

标签: hibernate criteria-api jpa-2.1

我有以下具有继承的域模型:

@Entity
class A {

   @OneToMany           
   Set<B> b;

}

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", discriminatorType = @DiscriminatorType.STRING, length = 3)
abstract class B {

   @OneToMany           
   Set<C> c;

}

@Entity
@DiscriminatorValue("B1")
class B1 extends B {

   @OneToMany           
   Set<C> c;

}

@Entity
@DiscriminatorValue("B2")
class B2 extends B {
}


@Entity
class C {

} 

我想构建一个从C加载一些字段的查询,如下所示:

    class Dto {

        String a;
        String b;
        String c;      

        public Dto(String a, String b, String b) {
          ....
        }

    }

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery query = cb.createQuery(Dto.class); 
    Root<A> from = query.from(A.class);
    Join<A, B> joinB = from.join(A_.b);
    Join<A, B1> joinB1 = cb.treat(joinB, B1.class);
    Join<B1, C> joinC = joinB1.join(B1_.c);
    q.where(cb.equal(joinC.get(C_.id), cid);
    q.select(cb.construct(Dto.class, joinC.get(C_.value), joinB1.get(B1_.value), from.get(A_.value));
    e.createQuery(q).getResultList();

看来,在更多联接中使用treat是不可能的,这种处理必须是叶子连接。 请参阅eclipselink或SO this。 会发生什么是hibernate(4.3.6,我正在使用的版本)不会在jpql查询中生成别名。
我是否误解了对待操作员的使用?
有没有办法解决这个问题?

0 个答案:

没有答案