Hibernate имеет возможность применять произвольные фильтры поверх ваших данных.Эти фильтры применяются во время выполнения данного сеанса.Во-первых, вам нужно определить их.
@org.hibernate.annotations.FilterDef
или @FilterDefs
определить определение (я) фильтра, используемые фильтрами, используя то же имя.Определение фильтра имеет name()
и массив parameters()
.Параметр позволит вам настроить поведение фильтра во время выполнения.Каждый параметр определяется @ParamDef
, который имеет имя и тип.Вы также можете определить параметр defaultCondition()
для данного @FilterDef
, чтобы установить условие по умолчанию, которое будет использоваться, когда ни одно не определено в каждом отдельном @Filter
.@FilterDef
(s) могут быть определены на уровне класса или пакета.
Теперь нам нужно определить условие фильтра SQL, применяемое либо к загрузке объекта, либо к загрузке коллекции.@Filter
используется и помещается либо в сущность, либо в элемент коллекции
@Entity
@FilterDef(name="minLength", parameters=@ParamDef( name="minLength", type="integer" ) )
@Filters( {
@Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
@Filter(name="minLength", condition=":minLength <= length")
} )
public class Forest { ... }
Когда коллекция использует таблицу ассоциации в качестве реляционного представления, вы можете применить условие фильтрации к самой таблице ассоциации илик таблице целевого объекта.Чтобы применить ограничение к целевому объекту, используйте обычную аннотацию @Filter
.Однако, если вы хотите настроить таргетинг на таблицу ассоциации, используйте аннотацию @FilterJoinTable
.
@OneToMany
@JoinTable
//filter on the target entity table
@Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
//filter on the association table
@FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
public Set<Forest> getForests() { ... }