Спящая сущность с ограничением - PullRequest
1 голос
/ 02 ноября 2009

У нас есть таблица БД, которая отображается в спящий объект. Пока все идет хорошо ...

Однако мы хотим отображать только объекты, удовлетворяющие определенным критериям, например, «разные (fieldA, fieldB)» ...

Можно ли сопоставить аннотации в спящем и спящем режимах? Как мы можем это сделать? С @Filter?

Ответы [ 4 ]

1 голос
/ 04 ноября 2009

Я бы рекомендовал использовать аннотацию @Where. Эта аннотация может использоваться для элемента Entity или target entity коллекции. Вы предоставляете атрибут предложения, написанный на sql, который будет применяться к любому выбору, который hibernate выполняет для этой сущности. Он очень прост в использовании и легко читается.

Вот пример.

@Entity
//I am only interested in Donuts that have NOT been eaten
@Where(clause = "EATEN_YN = 'N'")
public class Donut {

  @Column(name = "FILLING")
  private String filling;

  @Column(name = "GLAZED")
  private boolean glazed = true;

  @Column(name = "EATEN_YN")
  private boolean eaten = false;

...

}
0 голосов
/ 02 ноября 2009

возможно, вы могли бы создать новое Pojo, которое инкапсулирует поля и условия, которые они должны регистрировать. А затем сделайте этот класс «пользовательским определяемым пользователем типом», так что Hibernate должен будет использовать предоставленный вами класс отображения для отображения этого «типа» ..

0 голосов
/ 03 ноября 2009

В дополнение к опциям, упомянутым Juha, вы также можете создать объект непосредственно из запроса SQL с помощью аннотаций NamedNativeQuery и SqlResultSetMapping.

@Entity
@SqlResultSetMapping(name = "compositekey", entities = 
  @EntityResult(entityClass = MiniBar.class, 
    fields = { @FieldResult(name = "miniBar", column = "BAR_ID"), })
)
@NamedNativeQuery(name = "compositekey", 
   query = "select BAR_ID from BAR", resultSetMapping = "compositekey")
@Table(name = "BAR")
public class Bar {

Приправьте SQL-запрос на свой вкус

0 голосов
/ 02 ноября 2009
  1. Вы можете создать представление, а затем отобразить это представление на объекте:

    create view my_data as
    select ... from ...
    
    @Entity(table="my_data")
    public class MyData { ... }
    
  2. Одним из вариантов является отображение таблицы в обычном режиме, тогда вы можете получить ваши всегда сущности через запрос или фильтр .

  3. Вы также можете сделать собственный SQL-запрос и сопоставить сущность с результатами:

    Query q = sess.createSQLQuery("SELECT DISTINCT fieldA, fieldB FROM some_table")
              .addEntity(MyEntity.class);
    List<MyEntity> cats = q.list();
    
  4. Также возможно добавить DISTINCT к этому типу HQL-запроса :

    select new Family(mother, mate, offspr)
    from DomesticCat as mother
    join mother.mate as mate
    left join mother.kittens as offspr
    

Методы 1, 3 и 4 сделают отображение только для чтения.

Не могли бы вы более подробно рассказать о критериях, которые вы используете? Подход к представлению является более общим, так как вы не можете делать все с помощью спящего запроса или фильтра.

...