Список фильтров, содержащийся в объекте, возвращаемом запросом jpa / hibernate - PullRequest
8 голосов
/ 21 июля 2010

У меня есть простая сущность jpa 'ApplicationForm' со списком один ко многим:

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

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

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

Мне было интересно, можно ли с помощью jpa или hibernate создать запрос для извлечения сущности ApplicationForm со словарем для определенной локали, например, только для него. Это было бы достаточно просто сделать со стандартным SQL, но я не могу перевести на hql.

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

Надеюсь, я прояснил ситуацию, и предоставленного кода достаточно.

спасибо

1 Ответ

7 голосов
/ 21 июля 2010

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

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

2.4.8.Фильтры

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() { ... }

См. Также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...