Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql JPQL合并非标量?_Sql_Jpa_Hql_Jpql - Fatal编程技术网

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