0

假设在我现有的生产数据库中,我有一个学生表。大多数学生都是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 将使用我的加载器查询作为标准的基础。如果这是可能的,任何代码片段或链接都将受到欢迎。
4

1 回答 1

0

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

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

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

于 2012-12-11T08:41:19.537 回答