Я столкнулся с проблемой в Hibernate, касающейся запросов к классам, которые используют наследование. В основном у меня следующая иерархия классов:
@Entity
@Table( name = "recording" )
class Recording
{
ClassA attributeSet;
...
}
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
@Table( name = "classA" )
public class ClassA
{
String Id;
...
}
@Entity
@Table( name = "ClassB1" )
@PrimaryKeyJoinColumn( name = "Id" )
public class ClassB1 extends ClassA
{
private Double P1300;
private Double P2000;
}
@Entity
@Table( name = "ClassB2" )
@PrimaryKeyJoinColumn( name = "Id" )
public class ClassB2 extends ClassA
{
private Double P1300;
private Double P3000;
}
Иерархия уже дана вот так, и я не могу ее легко изменить. Как вы можете видеть, ClassB1 и ClassB2 наследуются от ClassA. Оба класса содержат набор атрибутов, которые иногда даже имеют одни и те же имена (но я не могу переместить их в ClassA, поскольку возможно большее количество подклассов, которые их не используют). Класс Recording ссылается на один экземпляр одного из этих классов.
Теперь мой вопрос:
То, что я хочу сделать, - это выбрать все объекты Recording в моей базе данных, которые ссылаются на экземпляр ClassB1 или ClassB2, например, с. поле P1300 == 15,5 (так что это могут быть экземпляры ClassB1 или ClassB2, поскольку атрибут P1300 объявлен в обоих классах).
То, что я пробовал, выглядит примерно так:
Criteria criteria = session.createCriteria(Recording.class);
criteria.add( Restrictions.eq( "attributeSet.P1300", new Double(15.5) ) );
criteria.list();
Но поскольку P1300 не является атрибутом спящего режима ClassA, возникает исключение, сообщающее мне:
could not resolve property: P1300 of: ClassA
Как мне сказать hibernate, что он должен искать во всех подклассах, чтобы найти атрибут, который я хочу отфильтровать?
Спасибо, MichaelD