2011-06-21 17 views
1

我有一個表存儲應用的配置參數,如下所示:JPQL合併非標量?

setName | key  | value 
---------------------------------- 
dev  | FooEnabled | true 
dev  | BarEnabled | true 
qa  | FooEnabled | false 
...etc... 

每個參數,密鑰/值組合,屬於一個特定的「配置集」。可以很容易地選擇一組特定的所有屬性:

SELECT p Parameter p WHERE p.setName = :name 

所以,如果我想在一個名爲"dev"配置集合中的所有參數,我會回來

dev | FooEnabled | true 
dev | BarEnabled | true 

現在,我想選擇兩套聯合:

SELECT p Parameter p WHERE p.setName = :name1 OR p.setName = :name2 

...但排除行有重複鍵在設置給性能與name1優先級高於在集與012性能。如果name1"qa"name2"dev",那麼這將返回

dev | FooEnabled | true 
qa | BarEnabled | false 

爲了澄清,查詢應該選擇:

  • 每個屬性的設置名字name2,除非...
  • 有一個名爲name1的同一個鑰匙的財產,在這種情況下...
  • 選擇與setName = :name1而不是用setName = :name2

什麼JPQL查詢將有效地做到這一點的行?如果COALESCE非標量值的工作,那麼我想,這樣的事情可能工作:

SELECT 
    COALESCE(x, y) 
    FROM Property x, Property y 
    WHERE 
     x.setName = :name1 AND 
     y.setName = :name2 AND 
     x.key = y.key 

COALESCE只接受標量值。有任何想法嗎?


其他查詢嘗試/失敗:

SELECT 
    CASE 
     WHEN (NOT EXISTS (SELECT y FROM Property y WHERE y.setName = :name1 AND y.key = x.key)) 
     THEN x 
     ELSE y 
    END 
    FROM Property x 
    WHERE 
     x.setName = :name2 

我也有興趣在以同樣的方式選擇各行,通過key,我想看起來像下面的(如果只有COALESCE爲非標量工作):

SELECT 
    COALESCE(y, x) 
    FROM Property x, Property y 
    WHERE 
     x.key = :key AND 
     x.setName = :name1 AND 
     y.key = :key AND 
     y.setName = :name2 

回答

0

可能你可以創建一個查詢與基地LLY以下結構:

SELECT 
    Property p, 
    CASE WHEN setName=:name1 
     THEN 1 
     ELSE 0 
    as orderColumn 
FROM Property x 
WHERE x.setName = :name1 OR (x.setName =:name2 AND (NOT EXISTS (SELECT y FROM Property y WHERE y.setName = :name1 AND y.key = x.key))) 
ORDER BY orderColumn 

(只是從我的腦海裏,而不必它試圖)

+0

我與現在這個玩弄,但我沒有看到'orderColumn'排序的點... –

+0

@Matt Ball我用這樣一種方式解釋了句子'通過給集合中的屬性設置name1更高的優先級比集合中的屬性設置name2',你希望在匹配集合中由name1頂部和每個匹配name2底部...也許那是錯的... – Omnaest