Да тут все плохо, но с этим уже как-то можно жить с hibernate. Мне в проекте по другой причине нужно было добавить дефолтную фильтрацию. Пробовал @Where, @Filter, @Loader. И везде свои дыры и баги.
Для @Fetch(FetchMode.JOIN) @ManyToOne(fetch = FetchType.EAGER) Фильтрация @Where включается, если в join добавлено условие фильтрации @JoinColumnOrFormula по полю, не являющемуся id.
Пример:
модель
@Entity
@Table(name = "post_reference")
public class PostEagerJoinReference {
@Id
private Long id;
@Fetch(FetchMode.JOIN)
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumnOrFormula(column = @JoinColumn(name = "post_id", referencedColumnName = "id"))
@JoinColumnOrFormula(formula = @JoinFormula(value = "any", referencedColumnName = "title"))
private Post post;
}
@Entity
@Table(name = "post")
@Where(clause = "deleted = false")
public class Post implements Serializable {
@Id
private Long id;
@Column(name = "title")
private String title;
@Column(name = "deleted")
private boolean deleted = false;
}
select
posteagerj0_.id as id1_1_0_,
posteagerj0_.post_id as post_id2_1_0_,
any as formula2_0_,
post1_.id as id1_0_1_,
post1_.deleted as deleted2_0_1_,
post1_.title as title3_0_1_
from
post_reference posteagerj0_
left outer join
post post1_
on posteagerj0_.post_id=post1_.id
and any=post1_.title
and (
post1_.deleted = false
)
where
posteagerj0_.id=?
В качестве поля не являющимся id можно использовать delete = true, тогда фильтр `deleted = false` на JOIN задвоится.
Да и он на фетчинг никак не влияет, только на запросы. Полезная штука)
Да тут все плохо, но с этим уже как-то можно жить с hibernate. Мне в проекте по другой причине нужно было добавить дефолтную фильтрацию. Пробовал @Where, @Filter, @Loader. И везде свои дыры и баги.
Для @Fetch(FetchMode.JOIN) @ManyToOne(fetch = FetchType.EAGER) Фильтрация @Where включается, если в join добавлено условие фильтрации @JoinColumnOrFormula по полю, не являющемуся id.
Пример:
модель
на запрос
генерируется запрос:
В качестве поля не являющимся id можно использовать delete = true, тогда фильтр `deleted = false` на JOIN задвоится.
Кстати еще это приведет вот к такому багу https://hibernate.atlassian.net/browse/HHH-7668, который решается добавлением на сущность
implements Serializable
.