Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 一对多查询元组_Sql_Jpa - Fatal编程技术网

Sql 一对多查询元组

Sql 一对多查询元组,sql,jpa,Sql,Jpa,我有一个与实体2有一对多关系的实体1。 Entity2存储属性,并具有字段“key”和“value” 现在我需要查询所有具有特定键/值组合(和逻辑)的Entity1 用这个 SELECT some_filed FROM Entity1 AS e1 Join e1.props AS p WHERE (p.key = :key1 and p.value = :value1) and (p.key = :key2 and p.value = :value2); 一种容易推广到更多键/值对的方法是

我有一个与实体2有一对多关系的实体1。 Entity2存储属性,并具有字段“key”和“value”

现在我需要查询所有具有特定键/值组合(和逻辑)的Entity1

用这个

SELECT some_filed FROM Entity1 AS e1 Join e1.props AS p 
WHERE 
(p.key = :key1 and p.value = :value1)
and
(p.key = :key2 and p.value = :value2);

一种容易推广到更多键/值对的方法是使用条件聚合:

SELECT entity_id
FROM e.props
GROUP BY entity_id
HAVING SUM(CASE WHEN e2.key = :key1 and e2.value = :value1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN e2.key = :key2 and e2.value = :value2 THEN 1 ELSE 0 END) > 0;

对于更多条件,您只需将更多子句添加到
having

JPA理解存在:

SELECT e1 FROM Entity1 e1 
WHERE exists (select 1 from Entity2 e2 
              where e2.entity1.id = e1.id
                and e2.key = :key1 and e2.value = :value1)
  AND exists (select 1 from Entity2 e2 
              where e2.entity1.id = e1.id
                and e2.key = :key2 and e2.value = :value2);

可能是“e2.key=:key1和e2.value=:value1或e2.key=:key2和e2.value=:value2”@Multisync,它不会检查属性的组合。你看,这个查询不会为key1-key2返回任何东西,通常情况下是这样。@Dmitry:我只是尝试更正语法而不是逻辑。是我的查询错了吗?我想是的,甚至从语法的角度。。。[内部]JOIN语句应该包含ON子句:)抱歉,我错了,没有注意到“JPA”标记。但我仍然不明白您的查询如何确保两个不同的道具具有指定的值。我猜这是一个本机SQL查询。这是一个合适的JPQL查询,可以正常工作。从EsbErrorEntity中选择e1作为e1 Join e1.props e21 Join e1.props e22,其中e21.headerKey=:key1和e21.headerValue=:value1和e22.headerKey=:key2和e21.headerValue=:value2
SELECT entity_id
FROM e.props
GROUP BY entity_id
HAVING SUM(CASE WHEN e2.key = :key1 and e2.value = :value1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN e2.key = :key2 and e2.value = :value2 THEN 1 ELSE 0 END) > 0;
SELECT e1 FROM Entity1 e1 
WHERE exists (select 1 from Entity2 e2 
              where e2.entity1.id = e1.id
                and e2.key = :key1 and e2.value = :value1)
  AND exists (select 1 from Entity2 e2 
              where e2.entity1.id = e1.id
                and e2.key = :key2 and e2.value = :value2);