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
Postgresql 如何检索记录,但仅当每个链接子实体列';存档';设置为真?_Postgresql_Jpa_Eclipselink - Fatal编程技术网

Postgresql 如何检索记录,但仅当每个链接子实体列';存档';设置为真?

Postgresql 如何检索记录,但仅当每个链接子实体列';存档';设置为真?,postgresql,jpa,eclipselink,Postgresql,Jpa,Eclipselink,我有一个名为Record的实体存储在postgresql表中 这些记录可以在备份介质上存档 关联是这样的:记录关联表媒体 一条记录可以与多个媒体关联。关联表提供了一个属性:归档为布尔值 我想写一个返回记录列表的查询。 但我只想在与媒体的每个关联都将“存档”属性设置为true时查找记录 样本: 媒体(id、名称) 1、第一媒体 2、第二媒体 记录(id、名称) 10,第一条记录 20,第二条记录 30,第三次记录 关联(媒体id、记录id、存档) 1,10,正确 2、10、假 1,20,假 1,3

我有一个名为Record的实体存储在postgresql表中

这些记录可以在备份介质上存档

关联是这样的:记录关联表媒体

一条记录可以与多个媒体关联。关联表提供了一个属性:归档为布尔值

我想写一个返回记录列表的查询。 但我只想在与媒体的每个关联都将“存档”属性设置为true时查找记录

样本:

媒体(id、名称)
1、第一媒体
2、第二媒体

记录(id、名称)
10,第一条记录
20,第二条记录
30,第三次记录

关联(媒体id、记录id、存档)
1,10,正确
2、10、假
1,20,假
1,30,正确
2,30,对

这里我们有3条记录,记录10链接到媒体1和2,但媒体2没有存档,所以我不想要它。记录20仅链接到媒体1,但未存档,我也不想要它。然后,记录30链接到介质1和2,并且都标记为已存档。这就是我想找的那种唱片

我试过这样的方法:

SELECT r FROM Record r, ArchiveMediasRecords ass, AchiveMedia a WHERE ass MEMBER OF r.medias AND ass MEMBER OF a.records AND ass.archived = true
但是ass.archived=true不是一个匹配“每个”关联的标准

谢谢

注:Java8U51、Eclipselink 2.6和PostgreSQL 9.4

编辑,使用纯SQL提供以下信息:

EXPLAIN SELECT * FROM recorder.records r WHERE true = ALL (
    SELECT archived FROM recorder.archive_medias_records WHERE record_id = r.id
)


Seq Scan on records r  (cost=0.00..6026.82 rows=190 width=182)
  Filter: (SubPlan 1)
  SubPlan 1
    ->  Seq Scan on archive_medias_records  (cost=0.00..31.63 rows=9 width=1)
          Filter: (record_id = r.id)
实际数据:

记录
2001;.....
2002;.....
2003;.....

媒体
1.“扑通一声”
5.“plip”

关联
1.2001;真的

1;2002;TRUE  
5;2002;FALSE  

1;2003;TRUE  
5;2003;TRUE  
预期:
记录2001年和2003年

可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:


上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。

可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:


上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。

可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:


上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。

可能有几种方法可以做到这一点,但我会尝试在子查询中使用“ALL”:

上述查询假设您具有ArchiveMediaRecord.record关系。如果没有,则需要像在原始查询中一样使用的成员。

DDL和示例数据:

CREATE TABLE media (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO media VALUES
  (1,'PLop'),
  (5,'plip');

CREATE TABLE record (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO record VALUES
  (2001,'First record'),
  (2002,'Second record'),
  (2003,'Third record');

CREATE TABLE assosiation(
  mediaid INTEGER REFERENCES media(id),
  recordid INTEGER REFERENCES record(id),
  archived BOOLEAN
);
INSERT INTO assosiation VALUES
  (1,2001,true),
  (1,2002,true),
  (5,2002,false),
  (1,2003,true),
  (5,2003,true);
下面的psql返回预期值:

SELECT * FROM record r WHERE
true = ALL (
  SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:

  id  |     name     
------+--------------
 2001 | First record
 2003 | Third record
(2 rows)
DDL和示例数据:

CREATE TABLE media (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO media VALUES
  (1,'PLop'),
  (5,'plip');

CREATE TABLE record (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO record VALUES
  (2001,'First record'),
  (2002,'Second record'),
  (2003,'Third record');

CREATE TABLE assosiation(
  mediaid INTEGER REFERENCES media(id),
  recordid INTEGER REFERENCES record(id),
  archived BOOLEAN
);
INSERT INTO assosiation VALUES
  (1,2001,true),
  (1,2002,true),
  (5,2002,false),
  (1,2003,true),
  (5,2003,true);
下面的psql返回预期值:

SELECT * FROM record r WHERE
true = ALL (
  SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:

  id  |     name     
------+--------------
 2001 | First record
 2003 | Third record
(2 rows)
DDL和示例数据:

CREATE TABLE media (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO media VALUES
  (1,'PLop'),
  (5,'plip');

CREATE TABLE record (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO record VALUES
  (2001,'First record'),
  (2002,'Second record'),
  (2003,'Third record');

CREATE TABLE assosiation(
  mediaid INTEGER REFERENCES media(id),
  recordid INTEGER REFERENCES record(id),
  archived BOOLEAN
);
INSERT INTO assosiation VALUES
  (1,2001,true),
  (1,2002,true),
  (5,2002,false),
  (1,2003,true),
  (5,2003,true);
下面的psql返回预期值:

SELECT * FROM record r WHERE
true = ALL (
  SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:

  id  |     name     
------+--------------
 2001 | First record
 2003 | Third record
(2 rows)
DDL和示例数据:

CREATE TABLE media (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO media VALUES
  (1,'PLop'),
  (5,'plip');

CREATE TABLE record (
  id SERIAL PRIMARY KEY,
  name TEXT
);
INSERT INTO record VALUES
  (2001,'First record'),
  (2002,'Second record'),
  (2003,'Third record');

CREATE TABLE assosiation(
  mediaid INTEGER REFERENCES media(id),
  recordid INTEGER REFERENCES record(id),
  archived BOOLEAN
);
INSERT INTO assosiation VALUES
  (1,2001,true),
  (1,2002,true),
  (5,2002,false),
  (1,2003,true),
  (5,2003,true);
下面的psql返回预期值:

SELECT * FROM record r WHERE
true = ALL (
  SELECT archived FROM assosiation WHERE recordid = r.id
);
输出:

  id  |     name     
------+--------------
 2001 | First record
 2003 | Third record
(2 rows)


这可能是一个很好的方法,但对我来说似乎不起作用。我会改为尝试过的纯sql:选择*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False这可能是一个好方法,但它似乎对我不起作用。我会d只需更改为尝试过的纯sql:select*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False这可能是一个好方法,但它似乎对我不起作用。我会d只需更改为尝试过的纯sql:select*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False这可能是一个好方法,但它似乎对我不起作用。我会d只需更改为尝试过的纯sql:select*from records as r,其中true=all(选择b.archived from archive_medias_records as b,其中b.record_id=r.id),这也不起作用:(@iXô似乎不起作用也没有帮助。结果与预期结果有什么不同?用它来改善问题是的,我知道这是作品返回,当我说它不起作用时,我的意思是它返回我的记录,其中一个关联已存档=False你能更具体一点吗?(包括您正在使用的错误跟踪/postgesql/jpa版本)@iXô在您的问题中提到“。当与媒体的每个关联都将存档属性设置为true时…”但是您没有提到所有关联记录都应该显示……您的意思正确吗?@iXô抱歉,是的,这就是我想要的,当所有关联都设置为achived=trueOk时,我想要记录。谢谢,如果一个记录与每种媒体关联,它会起作用,但是如果一个记录仅与媒体的子集关联,则无法显示此记录返回。也许通过调整第二个子选择我们可以实现这个,有什么想法吗?好的。请用输入的样本数据更改原始问题