Sql 一对多查询元组
我有一个与实体2有一对多关系的实体1。 Entity2存储属性,并具有字段“key”和“value” 现在我需要查询所有具有特定键/值组合(和逻辑)的Entity1 用这个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); 一种容易推广到更多键/值对的方法是
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);