2012-02-23 8 views
0

次の問題があります。削除と挿入のみで「dif」テーブルをロードしています。 「変更」は、削除とそれに続く挿入によって決定されます。テーブル内の行の順番

このテーブルにはプライマリキーはなく、注文するフィールドはありません。私はこのテーブルをロードするためにHibernateを使用したい。 (SELECT obj FROM MyDifTable obj WHERE obj.group = groupId

現時点では、すべての値と上記のクエリでキーを使用していますが、ソーステーブルと同じ順序で行が取得されません。

私の質問は以下のとおりです。

  1. 私はHibernateは常にテーブルと同じ順序を返させてはどうすればよいですか?
  2. この場合、主キーの指定方法は?

私はこのようにひどく設計されていることを知っています。私はデザインチームと議論しようとしましたが、成功しませんでした。

よろしくは、 甲斐

+2

一般に、 'ORDER BY'を持たない' SELECT'は、行が返される順序を保証しません。このことを念頭に置いて、*「テーブルの中と同じ順序」*を求める*は疑わしいです。 – NPE

+1

aixがすでに指摘しているように、(リレーショナル)テーブルの行には**の命令はありません**。コンプライアンスを確実にする唯一の方法は、 'ORDER BY'を使うことです。 –

+1

前のコメントを念頭に置いてください。通常、特定のデータベースエンジンには、何らかの並べ替えを行うために使用できる「row_id」プロパティがあります。しかし、以前のコメントは古い真実。構文はエンジン依存です。 – pcalcao

答えて

3

リレーショナルデータベースは、集合論の枝に基づいています。情報は、データベース内(Set内)または存在しない。順序は集合の概念ではなく、存在のみが集合の概念である。これは、必要に応じて明示的に注文をモデル化する必要があることを意味します。

オーダーを更新する必要がある場合は、結果セットのメンバーをソートするために「order by」句を追加する必要があります。時にはそのソートは外部です(クエリの提出時間まで注文の決定を遅らせることができます)。ごくまれに、その注文を「データセット」に内部化することが重要です。

奇妙なケースでは、内在化された注文が必要な場合は、注文をデータと共にセットに保存する必要があります。 "order by"句の存在を強制するには(クエリ作成者が省略することもあります)、データのストアドプロシージャ/ビューをいくつか配置して、クエリが常に正しい順序で返されるようにする必要があります。

リストをデータベースに格納する際に、内部的な順序付けの例が一般的です。典型的には、リスト項目を同じ行のリストにそのインデックスと共に格納する。このようにして検索すると、注文品をに復元できます。

+0

はい、それはまさに私がデザインチームに言ったことです:)しかし、私は非常に若いので、私は100%確実ではありませんでした。しかし、OracleのrowIdを使用して問題を解決しています。 – KaiThomasWerther

+1

特定のデータベースの実装の詳細なので、ROWIDに注意してください。新しいデータベースに移植する必要がある場合は、同様の機能を実装する別のデータベースを見つけて、別のデータベースで動作するようにコードを書き直す必要があります。一方、RDBMS(またはデータベース固有の機能)を使用せずに注文をモデル化すると、データベース固有の「機能」に依存しないため、ソリューションは任意のリレーショナル・データベースで機能します。 –

関連する問題