У меня есть простой 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 ошибку.
Я надеюсь, что ясно выразился, и предоставленный код достаточно.
спасибо
Мне интересно, возможно ли с помощью 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() { ... }