我正试图使用Spring Data Spanner通过交错表的字段进行查询。当Spring Data Spanner执行ARRAY STRUCT内部联接时,它会自动进行id比较,但我无法向Interleaved表查询添加WHERE子句。
考虑以下示例:
CREATE TABLE Singers (
Id INT64 NOT NULL,
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo BYTES(MAX),
) PRIMARY KEY (Id);
CREATE TABLE Albums (
SingerId INT64 NOT NULL,
Id INT64 NOT NULL,
AlbumTitle STRING(MAX),
) PRIMARY KEY (SingerId, Id),
INTERLEAVE IN PARENT Singers ON DELETE CASCADE;
假设我想查询CCD_ 1为"0"的所有Singer;恐惧黑暗";,如何使用Spring Data Spanner编写一个存储库方法来实现这一点?
您的示例似乎包含几个拼写错误,或者在其他方面不完全正确:
- Singers表有一列
Id
,它是主键。这本身很好,但在创建交错表的层次结构时,建议在主键列前面加上表名。因此,最好将其命名为SingerId
Albums
表具有SingerId
列和Id
列。这两列构成了Albums
表的主键。这在技术上是不正确的(而且令人困惑(,也是我认为你的例子不完全正确的原因。因为Albums
在Singers
中交错,所以除了形成AlbumTitle
2主键的任何附加列之外,Albums
还必须包含与Singers
表相同的主键列。在这种情况下,Id
引用Singers
表,而SingerId
是Albums
表中的一个附加列,与Singers
表无关。父表的主键列也必须以与父表相同的顺序出现
因此,示例数据模型应更改为:
CREATE TABLE Singers (
SingerId INT64 NOT NULL,
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo BYTES(MAX),
) PRIMARY KEY (SingerId);
CREATE TABLE Albums (
SingerId INT64 NOT NULL,
AlbumId INT64 NOT NULL,
AlbumTitle STRING(MAX),
) PRIMARY KEY (SingerId, AlbumId),
INTERLEAVE IN PARENT Singers ON DELETE CASCADE;
从这一点开始,您可以将Albums
表中的SingerId
列视为与Singer
的外键关系,并将其视为任何其他数据库系统中的外键关系。还请注意,每个歌手可能有多张专辑,因此查询。。。我想查询专辑标题为"的所有歌手;对黑暗的恐惧有点模棱两可。我宁愿说:
给我所有歌手,他们至少有一张专辑的标题是";对黑暗的恐惧
一个有效的查询是:
SELECT *
FROM Singers
WHERE SingerId IN (
SELECT SingerId
FROM Albums
WHERE AlbumTitle='Fear of the Dark'
)