Недопустимый идентификатор в фильтре гибернации по умолчанию при попытке получить доступ к полю одного из его подполей

#java #hibernate

#java #гибернация

Вопрос:

Я работаю над настройкой некоторых объектов для проекта, над которым я работаю. Моя проблема в том, что я получаю ошибку недопустимого идентификатора в моих фильтрах гибернации. Ниже приведен упрощенный пример:

 @Data
@Entity
@Table(name = "###")
public class C1 {
    
   @OneToMany(mappedBy = "###")
   @Filter(name = "C2.set1Filter")
   private Set<C2> set1;

   @OneToMany(mappedBy = "###")
   @Filter(name = "C2.set2Filter")
   private Set<C2> set2;

   @OneToMany(mappedBy = "###")
   @Filter(name = "C2.set3Filter")
   private Set<C2> set3;
    
}

@Data
@Entity
@Table(name = "###")
@FilterDefs({
   @FilterDef(
      name = "set1Filter"
      defaultCondition = "c3.value = 'One'"
   ),
   @FilterDef(
       name = "set2Filter"
       defaultCondition = "c3.value = 'Two'"
   ),
   @FilterDef(
       name = "set3Filter"
       defaultCondition = "c3.value = 'Three'"
   )
})
public class C2 {

   @ManyToOne
   @JoinColumn(name = "ID")
   C3 c3;
}

@Data
@Entity
@Table(name = "###")
public class C3 {
   
   @Id
   @Column(name = "ID")
   private Long id;

   @Column(name = "VALUE")
   private String value;
}
  

Когда фильтры выключены, они не запускаются, и поэтому я не получаю сообщение об ошибке. Однако, когда они включены, я получаю сообщение об ошибке, в котором говорится, что c3.value это недопустимый идентификатор.

Я, очевидно, делаю здесь что-то не так. Возможно ли заставить вышеуказанное работать?

Ответ №1:

Как указано в документации:

@Filter Условие использует условие SQL, а не предикат фильтрации JPQL.

Итак, вы должны использовать реальные имена таблиц и столбцов.

 @Filter(
    name="setFilter",
    condition="{c3}.VALUE = :val",
    aliases = {
        @SqlFragmentAlias( alias = "c3", table= "C3_TABLE_NAME")
    }
)
  

Как указано здесь:

При использовании @Filter аннотации и работе с объектами, которые отображаются на несколько таблиц базы данных, вам нужно будет использовать @SqlFragmentAlias аннотацию, если @Filter определено условие, которое использует предикаты в нескольких таблицах.