Hibernate可以动态地将参数传递给子集查询吗?

时间:2013-06-25 08:47:03

标签: hibernate database-design orm hibernate-mapping

当我使用Hibernate时,我遇到了一个非常特殊的情况:

我们的系统有一个调查模块,一个调查有很多种问题,我们的问题展示信息如标题,提示应该支持国际化,可以由管理员在database中定义,所以一个问题对应几个问题问题词汇的语言。以下是ER图: enter image description here

这是POJO:

POJO SurveyModel:

@Entity
@Table(name = "t_survey")
public class SurveyModel extends BasicModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "surveyId")
    private Set<QuestionModel> questions = new HashSet<QuestionModel>();
}

POJO QuestionModel:

@Entity
@Table(name = "t_question")
public class QuestionModel extends BasicModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "questionId")
    private Set<VocabularyModel> vocabularies = new HashSet<VocabularyModel>();
}

POJO VocabularyModel:

@Entity
@Table(name = "t_vocabulary")
public class VocabularyModel extends BasicModel {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String language;
    private String title;
    private String prompt;
}

因此图表和POJO关系清楚地显示了他们的关系。现在,当用户进行调查时,一次只需要一种单一的词汇对象语言,是的,我们可以通过手工过滤包含所有词汇的词汇集来获得它,但它没有意义并产生性能较低。在我们的系统中,父对象的所有子集都是loaded lazy,那么如何在我获得像SurveyModel之类的父对象之后,将类似语言的参数传递给子查询来过滤词汇集?我试图使用Hibernate Filters,但似乎与我的情况不符。

有人可以给我帮助和想法吗?非常感谢提前。

编辑:我有另一种方法可以做到这一点,只在不获取子对象的情况下进行调查,然后使用像language这样的参数手动查询其子对象。但它没有充分利用Hibernate。所以我也想在Hibernate中寻找一种方法来实现我的目标。

1 个答案:

答案 0 :(得分:0)

在整整半天的工作中,我设法找到了解决这个问题的解决方案。它仍然是 Hibernate Filters 。以下是解决问题的解释。

1,在目标实体上定义 Filter ,如下所示:

@FilterDef(name="questionLanguage", parameters=@ParamDef(name="language", type="string"), defaultCondition="language='cn'")

2,在设置对象

上添加 Filter
@Filter(name="questionLanguage", condition="language = :language")

3,由于过滤器的范围是一个 Session ,因此我们需要启用 Filter 并在查询之前设置参数你的父实体对象。

session.enableFilter("questionLanguage").setParameter("language", language);

为完成这项工作感到高兴。 ^。^。