我有一个简单的jpa实体“ ApplicationForm”,其中有一对多列表:
@OneToMany(cascade=CascadeType.REMOVE, mappedBy="textQuestion") private List<Dictionary> questions;
ApplicationForm中包含的变量Dictionary是仅带有问题文本的另一个普通实体。字典映射的相应数据库表为:
'locale' 'text' 'formId' en my question 123 it mia domanda 123
我想知道是否可以使用jpa或hibernate建立一个查询,以使用特定语言环境(例如“ it”)的Dictionary检索ApplicationForm实体。使用标准sql可以轻松完成,但是我无法在hql中进行翻译。
如果不可能,您是否可以建议其他方法?我试图手动迭代“字典”问题列表并删除不需要的语言环境,但它不是很优雅,而且我遇到了jpa / hibernate错误。
我希望我自己说清楚了,提供的代码就足够了。
谢谢
我想知道是否可以使用jpa或hibernate建立一个查询,以使用特定语言环境(例如“ it”)的Dictionary检索ApplicationForm实体。
不适用于标准JPA。但是Hibernate允许在给定的会话期间将任意过滤器应用于收集负载。从《 Hibernate注释参考指南》中:
2.4.8。筛选器 Hibernate可以在数据之上应用任意过滤器。这些过滤器将在运行时应用于给定的会话。首先,您需要定义它们。 @org.hibernate.annotations.FilterDef 或@FilterDefs使用相同的名称定义过滤器使用的过滤器定义。过滤器定义具有name()和的数组 parameters()。参数将允许您在运行时调整过滤器的行为。每个参数由@ParamDef具有名称和类型的定义。您也可以defaultCondition()为给定定义一个 参数,@FilterDef以设置在每个个人中都未定义的默认条件@Filter。甲 @FilterDef(或多个)可以在类或包级别来定义。 现在,我们需要定义应用于实体加载或集合加载的SQL filter子句。@Filter 用于实体或集合元素上
2.4.8。筛选器
Hibernate可以在数据之上应用任意过滤器。这些过滤器将在运行时应用于给定的会话。首先,您需要定义它们。
@org.hibernate.annotations.FilterDef 或@FilterDefs使用相同的名称定义过滤器使用的过滤器定义。过滤器定义具有name()和的数组 parameters()。参数将允许您在运行时调整过滤器的行为。每个参数由@ParamDef具有名称和类型的定义。您也可以defaultCondition()为给定定义一个 参数,@FilterDef以设置在每个个人中都未定义的默认条件@Filter。甲 @FilterDef(或多个)可以在类或包级别来定义。
@org.hibernate.annotations.FilterDef
@FilterDefs
name()
parameters()
@ParamDef
defaultCondition()
@FilterDef
@Filter
现在,我们需要定义应用于实体加载或集合加载的SQL filter子句。@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注释。
@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() { ... }