2015-01-08 2 views
1

Скажем, у меня есть следующие объекты:JPA Запрос на sublclass с SingleTable наследования

@Entity 
public class Container 
{ 
    @OneToMany 
    Set<AbstractElement> elements; 

    //getter setter and other attributes... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name = "CLASS_CODE", discriminatorType = DiscriminatorType.STRING, length = 10) 
public abstract class AbstractElement<T> extends AbstractEntity 
{ 
    @Transient 
    T value; 

    //getter setter and other attributes... 
} 

@DiscriminatorValue(value = "BOOL") 
@Entity 
public class BooleanElement extends AbstractElement<Boolean> 
{ 
    /** 
    * {@inheritDoc} 
    */ 
    @Column(name = "VALUE_BOOL") 
    @Override 
    public Boolean getValue() 
    { 
     return super.getValue(); 
    } 
} 

Вопрос заключается в следующем:

Как я могу выполнить JPA критерии запроса на значении BooleanElement, начиная с класс КОНТЕЙНЕР?

То, что я на самом деле до сих пор это:

CriteriaQuery<Container> criteriaQuery = criteriaBuilder.createQuery(Container.class); 
Root<Container> from = criteriaQuery.from(Container.class); 
criteriaQuery.select(from); 
from = from.join("elements"); 
Predicate pred = criteriaBuilder.equal(criteriaBuilder.treat(from ,BooleanElement.class).get("value"), FOO); 

//etc...... 

Исключение в этой точке, что «не существует атрибутов значения на AbstractEntity».

Заранее спасибо.

ответ

0

Оператор Treat не работает в данном конкретном случае. Туз оператора на стыки это еще не так ясно, как реализовать: я получаю исключение броска класса в строке 3, при этом:

CriteriaQuery<AbstractElement> criteriaQuery = criteriaBuilder.createQuery(AbstractElement.class); 
Root<AbstractElement> rootAbstract = criteriaQuery.from(AbstractElement.class); 
Path predPath = (Path)rootAbstract.as(BooleanElement.class); 
predPath.get("value"); 

Единственный способ выполнить этот тип запроса путем выполнения подзапроса или создания дополнительного предложения «от»:

Root<BooleanElement> from2 = criteriaQuery.from(BooleanElement.class); 
Predicate joinPredicate = criteriaBuilder.equal(from, from2); 
....