Запрос критериев jpa/hibernate с обработкой и объединением с пониженной сущностью

У меня есть следующая модель домена с наследованием:

@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();

Кажется, нельзя использовать обработку в большем количестве объединений, обработка должна быть листовым соединением. см. eclipselink или SO это. Что происходит, так это то, что hibernate (4.3.6, версия, которую я использую) не генерирует псевдоним в запросе jpql.
Я неправильно понял использование оператора Treat?
Есть ли способ обойти это? проблема?


person landal79    schedule 13.06.2017    source источник
comment
Вы нашли обходной путь для этого?   -  person user1735921    schedule 31.12.2018