#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
определено условие, которое использует предикаты в нескольких таблицах.