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

Leo*_*rdo 8 java hibernate jpa

我有一个简单的jpa实体'ApplicationForm',里面有一个到多个列表:

 @OneToMany(cascade=CascadeType.REMOVE, mappedBy="textQuestion")
 private List<Dictionary> questions;
Run Code Online (Sandbox Code Playgroud)

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

'locale' 'text'      'formId'
en       my question 123 
it       mia domanda 123
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

Pas*_*ent 7

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

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

2.4.8.过滤器

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

@org.hibernate.annotations.FilterDef 或者@FilterDefs使用相同的名称定义过滤器使用的过滤器定义.过滤器定义有一个name()和一个数组 parameters().参数将允许您在运行时调整过滤器的行为.每个参数由a定义,@ParamDef其中包含名称和类型.您还可以定义defaultCondition()给定的 参数,@FilterDef以设置在每个人都没有定义时使用的默认条件@Filter.A @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 { ... }
Run Code Online (Sandbox Code Playgroud)

当集合使用关联表作为关系表示时,您可能希望将过滤条件应用于关联表本身或目标实体表.要在目标实体上应用约束,请使用常规@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() { ... }
Run Code Online (Sandbox Code Playgroud)

也可以看看