【问题标题】:Using custom loader and criteria in Hibernate在 Hibernate 中使用自定义加载器和条件
【发布时间】:2012-12-10 17:14:09
【问题描述】:

假设在我现有的生产数据库中,我有一个学生表。大多数学生都是ex。学生,我想将其与当前学生分开。更具体地说,我想为当前注册的学生保留学生表,并将其他学生移动到 Students_history 表。与连接到学生的其他一些表类似。这样做的动机是希望将 (school_name, student_id) 作为主键,有时同一所学校会重新分配 student_id,因此对于某个 10 年前毕业的学生和另一个目前就读的学生,我将拥有相同的 student_id。这个 student_id 是我无法控制的,它来自进入应用程序的数据。第二件事是我桌子上的许多操作会快得多,因为现在的学生比所有学生(包括毕业的学生)要少得多。

我能找到的最佳解决方案包括在 Student 表上定义触发器,删除它们会将学生(以及引用学生条目的其他数据)移动到相应的 Student_history 表。我试图弄清楚的部分是如何让 Hibernate 使用它。我想在网络应用程序中显示两个表(学生和学生历史)中的条目,就像它目前正在工作一样。为了在 Web 界面中显示这些数据,我使用了 GWT,其中数据是通过以下方式获取的:

Criteria criteria = session.createCriteria(Students.class);

在 Web 应用程序中对项目进行排序和过滤时,使用条件非常有帮助。我试过指定自定义查询进行加载,如下所示:

@Entity
@Table(name = "Students")
@Loader(namedQuery = "students")
@NamedNativeQuery(name = "students", query = "select * from students union all select * from students_history WHERE Id = ?", resultClass = Students.class)

查询之后是 Student 类的定义。这不起作用 - Hibernate 使用上述条件生成的查询不包括任何提及 students_history。

我正在使用 postgreSQL、Hibernate 4 和 Java 1.6。

我的问题是:

  1. 我在区分现在和老学生的正确轨道上吗?我的意思是在删除时使用辅助表和存储过程。
  2. Hibernate 标准能否与使用@Loader 注释定义的自定义加载查询一起使用?我预计 Hibernate 将使用我的加载器查询作为标准的基础。如果可能,欢迎使用任何代码 sn-p 或链接。

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

    命名查询是一项可帮助您重用 HQL/SQL 查询的功能。

    它们与 Criteria API 没有任何关系,Criteria API 是一种从数据库中选择的不同方式。因此,Criteria 无法使用您的加载程序查询。

    这样想:Criteria API 使用您提供的条件从头开始构建 SQL 查询。在您的情况下,它必须首先解释您的加载程序查询,然后围绕它构建一个正确的 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2018-03-13
      • 2019-11-12
      • 2011-02-22
      • 2011-01-19
      • 2012-11-08
      相关资源
      最近更新 更多