我有一个简单的jpa实体'ApplicationForm',其中包含一对多列表:
@OneToMany(cascade=CascadeType.REMOVE, mappedBy="textQuestion")
private List<Dictionary> questions;
ApplicationForm中包含的变量Dictionary只是另一个只有问题文本的普通实体。 由Dictionary映射的相应数据库表是:
'locale' 'text' 'formId'
en my question 123
it mia domanda 123
我想知道是否可以使用jpa或hibernate来构建查询以检索具有特定语言环境的Dictionary的ApplicationForm实体,例如仅“it”。 这对标准的sql来说很容易,但我不能在hql中翻译。
如果不可能,你能建议另一种方式吗?我试图手动迭代字典问题列表并删除不需要的语言环境,但不是很优雅,而且我还有一个jpa / hibernate错误。
我希望自己清楚明白,提供的代码就足够了。
感谢
答案 0 :(得分:7)
我想知道是否可以使用jpa或hibernate来构建查询以检索具有特定语言环境的Dictionary的ApplicationForm实体,例如仅“it”。
不适用于标准JPA。但是Hibernate允许在给定会话期间将任意filters应用于集合加载。从Hibernate Annotations参考指南:
2.4.8. Filters
Hibernate有能力申请 在您的数据之上的任意过滤器。 这些过滤器在运行时应用 在给定的会话上。首先,你需要 定义它们。
@org.hibernate.annotations.FilterDef
或@FilterDefs
定义过滤器 filter(s)使用的定义 同名。过滤器定义有 一个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() { ... }