Sql JPQL合并非标量?
我有一个存储应用程序配置参数的表,如下所示:Sql JPQL合并非标量?,sql,jpa,hql,jpql,Sql,Jpa,Hql,Jpql,我有一个存储应用程序配置参数的表,如下所示: setName | key | value ---------------------------------- dev | FooEnabled | true dev | BarEnabled | true qa | FooEnabled | false ...etc... 每个参数(键/值组合)都属于一个特定的“配置集”。很容易选择特定集中的所有属性: SELECT p Parameter p
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
的集合中指定优先级高于具有name2
的集合中的属性,消除具有重复键的行。如果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
我还对通过
键
以同样的方式选择单独的行感兴趣,我认为这将如下所示(如果COALESCE仅适用于非标量):
您可以创建一个基本上具有以下结构的查询:
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
(只是我的想法,没有尝试过)我现在正在玩弄这个,但我不明白
orderColumn
排序的意义…@Matt Ball我对你的句子进行了解释,即“赋予具有名称1的集合中的属性比具有名称2的集合中的属性更高的优先级”,你想让元素在匹配集合中的名称1在顶部,每个匹配的名称2在底部…也许这是错误的。。。
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