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

我有一个简单的jpa实体’ApplicationForm’,其中包含一对多列表:

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

ApplicationForm中包含的变量Dictionary只是另一个只有问题文本的普通实体。 由Dictionary映射的相应数据库表是:

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

我想知道是否可以使用jpa或hibernate来构建一个查询,用于检索具有特定语言环境的Dictionary的ApplicationForm实体,例如“it”。 这对标准的sql来说很容易,但是我无法在hql中进行翻译。

如果不可能,你能建议另一种方式吗? 我试图手动迭代字典问题列表并删除不需要的语言环境,但不是很优雅,而且我还有一个jpa / hibernate错误。

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

谢谢

我想知道是否可以使用jpa或hibernate来构建一个查询,用于检索具有特定语言环境的Dictionary的ApplicationForm实体,例如“it”。

不是标准的JPA。 但是Hibernate允许在给定会话期间将任意filter应用于集合加载。 从Hibernate Annotations参考指南:

2.4.8。 filter

Hibernate能够在数据之上应用任意filter。 这些filter在运行时应用于给定会话。 首先,您需要定义它们。

@org.hibernate.annotations.FilterDef@FilterDefs使用相同的名称定义filter使用的filter定义。 filter定义具有name()parameters()数组parameters() 。 参数将允许您在运行时调整filter的行为。 每个参数都由@ParamDef定义,它具有名称和类型。 您还可以为给定的@FilterDef定义defaultCondition()参数,以设置在每个@Filter中都没有定义时使用的默认条件。 可以在类或包级别定义@FilterDef

我们现在需要定义应用于实体加载或集合加载的SQLfilter子句。 @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 getForests() { ... } 

也可以看看

  • 第17章过滤数据在Hibernate核心参考文档中。
  • Hibernate3filter