2009-01-09 51 views
4

根據上一個問題的答案(答案在這裏:SQL/Database Views in Grails),我嘗試使用一個域類來表示數據庫中的視圖。然而,在大多數情況下,這種方式非常有效:我有一個沒有唯一唯一鍵的視圖。比方說,基礎表看起來就像這樣:沒有ID字段或部分爲NULL複合字段的Grails域類

答:
ID,VARx前提
1, 「嗒嗒」
2, 「富」
3, 「酒吧」

B:
ID,A.id,C.id
1,2,1
2,2,2
3,3,1

C:
ID,變化
1, 「轟」
2, 「菲茲爾」

我的看法是這樣的:
A.id,VARx前提,B.id,C.id,變化
1 ,「Blah」,NULL,NULL,NULL
2,「Foo」,1,1,「Boom」
2,「Foo」,2,2,「Fizzle」
3,「Bar」,3, 1,「繁榮」

這正是它應該如何尋找我們的目的。然而,正如你可以看到,我們可以構建視圖的最獨特的複合ID爲[「A.id」,「C.id」],因爲這唯一標識每個元素,但Grails的,因爲它似乎無法對付失敗部分複合標識爲NULL(實際上,list()返回一個包含4個對象的列表,其中第一個是空指針,其餘部分是視圖的實際域實例)。

請注意,我們也可以使用A.id和B.id,但它遭受同樣的問題。

還要注意的是,我們要顯示,如果有在表B.多個相應的條目從表A中至少一次的元件(具有空值在表沒有發現B/C的任何字段),可能多次

所以,我的問題是2部分:
1:是否有可能定義一個沒有任何ID字段的grails域類?我們不需要任何視圖條目的永久句柄,我們只需要在該視圖中列出數據。
2:如果沒有,是可以限定具有複合ID字段,其一部分可以是NULL一個Grails域類,但其將唯一地識別無論如何一排即使複合ID的一部分是NULL?

我知道我們可以直接使用Groovy SQL直接查詢視圖而無需關聯的域類(我們現在正在實際執行此操作),但理想情況下我們希望使用域類來表示視圖。此外,除了所有的論點之外,這兩個問題可以更一般地應用,而不僅僅是我們的特定問題。

回答

3

我們之前有過這個問題。

根據我的經驗,Composite ID在Grails或Hibernate中支持得不好。

我們總是找到一種方法爲我們所有的域類擁有唯一的ID。

對於真正的表格,我們只是添加一個自動增量字段,即使我們沒有使用grails,我們也會使用複合鍵。

對於數據庫視圖,我們通常在其中一個連接表中有一個ID,最終在該上下文中是唯一的,但如果我們不這樣做,就有辦法對其進行破解/模擬。例如,在SQL中,只需將您在組合鍵中使用的鍵連接爲單個字段並將其用作鍵。

1

您是否嘗試過在此reference頁面上提及Composite Id部分提及的內容?我沒有嘗試過使用它,我不確定這是否在最新版本中發生了變化。

此外,如果你看看錶B,爲A.唯一值id是2和3所以你不認爲當A.id是1時,結果對於B.id,C.id和varY來說是空的嗎?還是僅僅作爲一個例子呢?

+0

結果/是/空的B.id,C.id,並改變......看到這行: 1, 「嗒嗒」,NULL,NULL,NULL 視圖使用兩個左聯接。 另外,是的,我嘗試了所有這些,問題是組合字段中的任何組件都不能爲null,對於上述視圖的任何合理組合字段而言都是如此。 – 2009-12-22 17:04:59

相關問題