2015-03-09 1 views
0

Добрый день,Querydsl: поле не правильно инициализировано на дочернем классе

Мы используем qdsl для доступа к нашим наследуемым объектам. У нас есть родительский класс (Parent), который имеет сложный объект (BasicProduct) в качестве поля. Затем у нас есть несколько детей (один из них - Child). В запросе мы пытаемся получить доступ к BasicProduct из автогенерируемого кода QChild. Из того, что мы видели, поле для доступа к BasicProduct существует как на QParent, так и на QChild, но только тот, что находится на QParent, правильно инициализирован.

Структура объектов:

Родительский объект -

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
name="TYPE", 
discriminatorType= DiscriminatorType.STRING) 
public abstract class Parent 

    //bunch of fields 

    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "BASIC_PRODUCT_ID") 
    protected BasicProduct basicProduct; 
} 

Детский объект -

@DiscriminatorValue(value = "Child") 
public class Child extends Parent { 
    //bunch of fields 
} 

Запрос доступа:

HibernateQuery query = new HibernateQuery(session); 

query = query.distinct().from(thing) 
.leftJoin(thing.childSet, child) 
.leftJoin(child.basicProduct(), basicProduct) 
.leftJoin(child.basicProduct().fieldA, fieldA) 
.leftJoin(basicProduct.fieldB, fieldB); 

Запрос доступа выше потерпеть неудачу чтобы построить. Что мы делаем не так?

ответ

2

Похоже, у вас есть смешанные типы генерации доступа к сущностям. Кажется, что у родителя есть entityAccessors, а Child - нет. Это может привести к проблемам, когда поля в QChild не инициализируются.

Попробуйте установить entityAccessors на QChild тоже.

+0

Спасибо. Это спасло нам дни расследования. Вы - бог среди людей. – Rince

+0

Бог действительно среди людей! :-) –

1

Если вы посмотрите на свой сгенерированный QChild, он должен содержать поля, унаследованные от его родителя (с комментарием ///inherited над полем). Все унаследованные поля: public final, поэтому вы можете их использовать.

Это говорит, basicProduct в QChild, и вы можете получить к нему доступ - удалить скобки из кода

вместо

.leftJoin(child.basicProduct(), basicProduct) 

вы должны иметь

.leftJoin(child.basicProduct, basicProduct) 
+0

Унаследованное поле автоматически генерируется как защищенный. В родительском классе это общедоступный финал. – Rince

Смежные вопросы