Hibernate: запрос объектов по атрибутам унаследованных классов - PullRequest
4 голосов
/ 16 марта 2010

Я столкнулся с проблемой в 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

Ответы [ 2 ]

0 голосов
/ 18 марта 2010

У меня нет доступа к хорошей IDE для проверки этого, но на первый взгляд вам нужно добавить псевдоним к вашему запросу.

Попробуйте добавить:

criteria.createAlias("attributeSet", "attributeSet");

Iне думаю, что проблема связана с иерархией, но с отсутствием псевдонима в вашем запросе.

0 голосов
/ 16 марта 2010

Поскольку свойство private Double P1300 появляется в обоих подклассах, просто перетащите его в родительский класс.

Если есть другие предки, у которых нет этого свойства, такой запрос не имеет особого смысла - attributeSet может иметь или не иметь это свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...