2012-02-23 42 views
0

我有以下問題:我正在加載一個只有刪除和插入的「dif」表。 「更改」由刪除後跟插入確定。表中的行的順序

此表沒有主鍵,也沒有字段可以排序。我想用Hibernate來加載這個表。 (SELECT obj FROM MyDifTable obj WHERE obj.group = groupId

現在,我在所有值和上面的查詢中使用了一個鍵,而且我沒有按照與源表中相同的順序獲取行。

我的問題是:

  1. 如何讓Hibernate總是返回相同的順序在表中?
  2. 如何在這種情況下指定主鍵?

我知道這是這樣一個設計糟糕的事情,我試圖論證與設計團隊,但沒有成功。

最好的問候, 凱

+2

請記住,通常'SELECT'沒有'ORDER BY'不能保證返回行的順序。考慮到這一點,要求*「與表格中的順序相同」*是可疑的。 – NPE 2012-02-23 14:59:54

+1

由於aix已經指出:(關係)表中的行確實沒有任何順序**。確保訂單順序的唯一方法是使用'ORDER BY' – 2012-02-23 15:02:03

+1

記住以前的註釋。通常,您的特定數據庫引擎會具有某種「row_id」屬性,您可以使用它來給予某種排序。但以前的評論老是真實的。雖然語法依賴於引擎。 – pcalcao 2012-02-23 15:07:13

回答

3

關係數據庫是基於集理論的一個分支。信息在數據庫中(在Set中)或不存在。訂單不是集合中的概念,只有存在是集合中的概念。這意味着如果您需要,您必須明確建模。

如果必須維護訂單,則必須添加一個「order by」子句對集合的結果成員進行排序。有時候這種排序是外部的(所以你可以延遲排序的決定直到查詢提交時間)。在非常罕見的情況下,將該訂單內化到「數據集」中非常重要。

在奇怪的情況下,您需要內部排序,您必須通過將訂單和數據一起存儲在集合中;但爲了執行「order by」子句的存在(查詢編寫者可能忽略它),您可能還必須放置一些存儲的數據存儲過程/視圖,以確保查詢始終以正確的順序返回。

將列表存儲到數據庫時,內部排序的示例很常見。一個通常將列表項與其索引一起存儲在同一行的列表中。通過這種方式檢索時,您可以恢復項目的排序。

+0

是的,這正是我所說的設計團隊:)但因爲我很年輕,我不能100%確定。但是使用Oracle的rowId正在解決這個問題。 – KaiThomasWerther 2012-02-23 17:07:03

+1

小心使用rowid,因爲它是您特定數據庫的實現細節。如果您必須移植到新數據庫(最終發生這種情況),您將不得不尋找另一個實現類似功能的數據庫,並可能重寫您的代碼以在另一個數據庫上工作。另一方面,如果您在不使用rowid(或任何數據庫特定功能)的情況下進行排序建模,那麼您的解決方案將適用於任何關係數據庫,因爲您不依賴於特定於數據庫的「功能」。 – 2012-02-23 17:10:52