使用Spring数据扳手通过交错表字段进行查询



我正试图使用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编写一个存储库方法来实现这一点?

您的示例似乎包含几个拼写错误,或者在其他方面不完全正确:

  1. Singers表有一列Id,它是主键。这本身很好,但在创建交错表的层次结构时,建议在主键列前面加上表名。因此,最好将其命名为SingerId
  2. Albums表具有SingerId列和Id列。这两列构成了Albums表的主键。这在技术上是不正确的(而且令人困惑(,也是我认为你的例子不完全正确的原因。因为AlbumsSingers中交错,所以除了形成AlbumTitle2主键的任何附加列之外,Albums还必须包含与Singers表相同的主键列。在这种情况下,Id引用Singers表,而SingerIdAlbums表中的一个附加列,与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'
)

最新更新