0

既存の本番データベースに、Students テーブルがあるとします。学生の大半は元です。現在の学生から切り離したい学生。より具体的には、現在在籍している学生用の Students テーブルを保持し、他の学生を Students_history テーブルに移動したいと考えています。同様に、Students に接続された他のいくつかのテーブルについても同様です。これの動機は、(school_name、student_id)を主キーとして持ちたいということであり、同じ学校がstudent_idを再割り当てすることがあるため、10年前に卒業した学生と現在在籍している別の学生に同じstudent_idを持つことになります。この student_id は、私の制御を超えたものであり、アプリケーションに入ってくるデータからのものです。2 つ目は、テーブルに対する多くの操作がはるかに高速になることです。

私が見つけた最善の解決策は、Students テーブルでトリガーを定義することです。トリガーを削除すると、学生 (および学生エントリを参照するその他のデータ) が対応する Student_history テーブルに移動します。私が理解しようとしている部分は、Hibernate をこれで動作させる方法です。現在機能しているように、Web アプリで両方のテーブル (Students と Students_history) のエントリを表示したいと思います。このデータを 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)

クエリの後に、Students クラスの定義が続きます。これは機能しません。前述の基準で 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 に答える