Список фильтра, содержавшийся в объекте, возвращенном запросом jpa/hibernate

У меня есть простой jpa объект 'ApplicationForm' с одним многим, перечисляют в нем:

 @OneToMany(cascade=CascadeType.REMOVE, mappedBy="textQuestion")
 private List<Dictionary> questions;

Переменный Словарь, содержавшийся в ApplicationForm, является просто другим простым объектом только с текстом вопроса. Соответствующая таблица базы данных, отображенная Словарем:

'locale' 'text'      'formId'
en       my question 123 
it       mia domanda 123

Я задавался вопросом, возможно ли это с jpa, или будьте в спящем режиме, для создания запроса для получения объекта ApplicationForm со Словарем для определенной локали, например, 'это' только. Это было бы достаточно легко сделать со стандартом sql, но я не могу перевести в hql.

Если не возможный, Вы могли бы предложить альтернативный путь? Я попытался вручную выполнить итерации списка вопросов о Словаре и удалить не требуемую локаль, но не действительно изящно, и также я получил jpa/hibernate ошибку.

Я надеюсь, что ясно выразился, и предоставленный код достаточно.

спасибо

8
задан Leonardo 21 July 2010 в 14:25
поделиться

1 ответ

Мне интересно, возможно ли с помощью jpa или hibernate создать запрос для получения сущности ApplicationForm со словарем для определенной локали, например, только для 'it'.

Со стандартным JPA - нет. Но Hibernate позволяет применять произвольные фильтры к загрузке коллекции во время данной сессии. Из справочного руководства по аннотациям Hibernate:

2.4.8. Фильтры

Hibernate имеет возможность применять произвольные фильтры поверх ваших данных. Эти фильтры применяются во время выполнения на данном сеансе. Сначала вам необходимо определить их.

@org.hibernate.annotations.FilterDef или @FilterDefs определяют фильтр определение(я), используемое(ые) фильтром(ами), использующим(и) одно и то же имя. Определение фильтра имеет имя() и массив из parameters(). Параметр позволяет вам настроить поведение фильтра во время выполнения. Каждый параметр определяется @ParamDef, который имеет имя и тип. Вы также можете определить defaultCondition() параметр для данного @FilterDef, чтобы установить условие по умолчанию, которое будет использоваться, когда ни одно из них не определено. условие, которое будет использоваться, если оно не определено в каждом отдельном @Filter. A @FilterDef(ы) могут быть определены на уровне уровне класса или пакета.

Теперь нам необходимо определить фильтр 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 annotation.

@OneToMany
@JoinTable
//фильтр на целевой таблице сущностей
@Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
//фильтр для таблицы объединения
@FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
public Set getForests() { ... }

См. также

7
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: