0

我正在尝试使用 Spring Data Spanner 通过交错表的字段进行查询。id 比较是由 Spring Data Spanner 在执行 ARRAY STRUCT 内部联接时自动完成的,但我无法将 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;

假设我想查询AlbumTitle“恐惧黑暗”的所有歌手,我如何编写存储库方法来使用 Spring Data Spanner 实现这一目标?

4

1 回答 1

1

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

  1. Singers 表有一列Id是主键。这本身很好,但是在创建交错表的层次结构时,建议在主键列前加上表名。所以最好给它起个名字SingerId
  2. Albums表具有一SingerId列和一Id列。这两列构成表的主键Albums。这在技术上是不正确的(并且令人困惑),也是我认为您的示例不完全正确的原因。因为Albums在 中交错Singers,除了构成 的主键的任何附加列之外,还Albums必须包含与表相同的主键列。在这种情况下引用表,并且是表中与表无关的附加。父表的主键列也必须以与父表相同的顺序出现。SingersAlbumsIdSingersSingerIdAlbumsSingers

因此,示例数据模型应更改为:

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;

从这一点开始,您可以将表中的SingerIdAlbums视为与 a 的外键关系,Singer并像在任何其他数据库系统中一样对待它。另请注意,每个歌手可以有多个专辑,因此查询...I want to query all Singers where AlbumTitle 为“Fear of the Dark”有点模棱两可。我宁愿说:

给我所有至少有一张专辑名为“恐惧黑暗”的歌手

一个有效的查询是:

SELECT *
FROM Singers
WHERE SingerId IN (
  SELECT SingerId
  FROM Albums
  WHERE AlbumTitle='Fear of the Dark'
)
于 2021-07-01T07:44:43.400 回答