【问题标题】:使用 Spring Data Spanner 按交错表字段查询
【发布时间】:2021-09-13 02:11:05
【问题描述】:

我正在尝试使用 Spring Data Spanner 通过交错表的字段进行查询。 id 比较是由 Spring Data Spanner 在执行 ARRAY STRUCT 内连接时自动完成的,但我无法将 WHERE 子句添加到 Interleaved 表查询中。

考虑下面的例子:

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 为“Fear of the Dark”的所有 Singers,如何使用 Spring Data Spanner 编写存储库方法来实现这一点?

【问题讨论】:

    标签: google-cloud-spanner spring-cloud-gcp interleave


    【解决方案1】:

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

    1. Singers 表有一个列Id,它是主键。这本身很好,但是在创建交错表的层次结构时,建议在主键列前加上表名。所以最好把它命名为SingerId
    2. Albums 表有一个SingerId 列和一个Id 列。这两列构成Albums 表的主键。这在技术上是不正确的(并且令人困惑),也是我认为您的示例不完全正确的原因。因为AlbumsSingers 中交错,所以Albums 必须包含与Singers 表相同的主键列,以及构成Albums 主键的任何其他列。在这种情况下,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 的外键关系,并像在任何其他数据库系统中一样对待它。另请注意,每个歌手可以有多个专辑,因此查询 ...我想查询 AlbumTitle 为“Fear of the Dark”的所有 Singers 有点模棱两可。我宁愿说:

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

    一个有效的查询是:

    SELECT *
    FROM Singers
    WHERE SingerId IN (
      SELECT SingerId
      FROM Albums
      WHERE AlbumTitle='Fear of the Dark'
    )
    

    【讨论】:

    • 我明白你的意思,你是对的。但我的问题是使用 Spring Data Spanner 执行此查询,因为显然,我无法向 Interleaved 表查询添加 WHERE 子句(所有存储库查询均由 Spring 自动生成)。
    • 我不确定您对“ 交错表查询”的确切含义。对于 Spring Data Spanner,Singer 和 Album 之间的关系应该与正常的外键关系非常相似。此外,您应该能够只使用普通的 SQL 查询来实现您想要的。有关如何执行查询的示例,请参阅 docs.spring.io/spring-cloud-gcp/docs/1.1.0.M1/reference/html/…。如果您要将我的答案中的查询插入其中,它应该(理论上)准确地返回您正在寻找的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2013-05-20
    • 2019-11-17
    • 1970-01-01
    • 2016-01-08
    • 2016-07-10
    • 2015-01-30
    相关资源
    最近更新 更多