筛选由jpa / hibernate查询返回的实体中包含的列表

时间:2010-07-21 14:25:14

标签: java hibernate jpa

我有一个简单的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错误。

我希望自己清楚明白,提供的代码就足够了。

感谢

1 个答案:

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

另见