如何搜索共享外键的两个表我想我问的是对的......?

问题描述

狗实体

@Entity(tableName = "dog_table")
public class DogEntity {

  private int mId;
  private String mName,mBreed;
  etc..
}

玩具实体

@Entity(tableName = "toy_table")
public class ToyEntity {

  private int mId;
  private String mName,mBrand;
  etc..
}

DogAndToy 连接表实体

@Entity(tableName = "dog_and_toy_join_table",primaryKeys = {"mDogID","mToyId"},foreignKeys = {
        @ForeignKey(
            entity = DogEntity.class,parentColumns = "mId",childColumns = "mDogID",onDelete = ForeignKey.CASCADE,onUpdate = ForeignKey.CASCADE
        ),@ForeignKey(
            entity = ToyEntity.class,childColumns = "mToyId",onUpdate = ForeignKey.CASCADE
        )
    },indices = {@Index("mDogID"),@Index("mToyId")}
)
public class DogAndToyJoinEntity{

  private final int mDogID,mToyId;

  public DogAndToyJoinEntity(int mDogID,int mToyId) {
    this.mDogID = mDogID;
    this.mToyId = mToyId;
  }
  etc..
}

DogAndToy 数据类

public class DogAndToy {

  @Embedded
  public Dog mDog;

  @Relation(
      parentColumn = "mId",entityColumn = "mId",entity = ToyEntity.class,associateBy =
      @Junction(
          value = DogAndToyJoinEntity.class,parentColumn = "mDogId",entityColumn = "mToyId"
      )
  )
  public List<ToyEntity> toyList;
}

注意:所有的狗都可以有多个玩具,玩具可以与多个狗相关联。 Dog & Toy 实体不共享任何字段(例如 - Dog 没有 toyId 等)

我已经尝试了几天来解决问题

如何查询/获取与一个玩具相关联的所有狗(按名称)

我使用 DogAndToy 数据类在我的 RecyclerView 中进行显示。

JOIN 和 INNER JOIN 查询令我感到困惑,我一直在尝试多种变体,但始终以零搜索结果告终。这是我最近的尝试:

  @Transaction
  @Query("SELECT dog_table.* FROM dog_table" +
      "INNER JOIN dog_and_toy_join_table ON dog_table.mId = dog_and_toy_join_table.mDogId" +
      "INNER JOIN toy_table ON toy_table.mId = dog_and_toy_join_table.mToyId " +
      "WHERE toy_table.mName LIKE :query")
  LiveData<List<DogAndToy>> findDogsByToyName(String query);

谁能建议对 Android Room 中这些查询的分步说明?我在这里或互联网上的任何地方找到的任何 JOIN 文章/示例都没有“加入”(外键)参考... 我是否以正确的方式尝试这个?

更新澄清一下,我有 FTS 表,我的“基本”搜索工作正常(例如 - 按名称搜索等)

解决方法

用变量替换 :toyName

SELECT d.mName FROM dog_table AS d
WHERE d.mId IN ( 
  SELECT j.mDogID FROM dog_and_toy_join_table AS j
  WHERE j.mToyId = (
    SELECT t.mId FROM toy_table AS t
    WHERE t.mName = :toyName));

编辑

TBH,不知道为什么它只选择一行。也许其他人可以回答。

这是平均时间:

select d.mName
from dog_table d 
    INNER join dog_and_toy_join_table dt
        on d.mid = dt.mDogID 
    INNER JOIN toy_table t
        ON dt.mToyId = t.mId
    WHERE t.mName = 'toy1'

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...