You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用Floor框架实现多表关联查询及返回值处理方法

Flutter Floor多表关联查询实现方案

步骤1:定义多表联合数据实体

多表查询返回的字段覆盖三张表,你需要先创建一个专门的组合实体类,用Floor提供的@Embedded注解嵌套各表的原有实体:

// 请确保你已经单独定义好了Junctiont、Item、Client三个表的@Entity实体类
class ItemClientJunction {
  // 嵌套关联表实体,存在同名字段时可加prefix参数指定前缀避免冲突
  @Embedded()
  final Junctiont junctiont;

  @Embedded()
  final Item item;

  @Embedded()
  final Client client;

  ItemClientJunction({
    required this.junctiont,
    required this.item,
    required this.client,
  });
}

注意:如果三张表存在同名字段(比如都有id字段),需要给@Embedded添加prefix属性,同时修改SQL语句给对应字段加别名,避免字段值被覆盖,比如注解改为@Embedded(prefix: 'junctiont_'),SQL中对应字段改为junctiont.id AS junctiont_id即可。

步骤2:在Dao中定义查询方法

在你的Dao抽象类中添加查询注解,直接写入关联查询SQL,返回值指定为刚才定义的联合实体的流:

@Dao
abstract class ItemDao {
  // 原有单表查询方法
  @Query('SELECT * FROM Item WHERE is_active = 1')
  Stream<List<Item>> getItems();

  // 新增多表关联查询方法
  @Query('''
    SELECT junctiont.*, item.*, client.*
    FROM item
    INNER JOIN junctiont
    ON item.id = junctiont.item_id
    INNER JOIN client
    ON junctiont.client_id = client.id
  ''')
  Stream<List<ItemClientJunction>> getItemsWithClients();
}

步骤3:生成后的实现代码说明

执行flutter packages pub run build_runner build生成代码后,在database.g.dart中会自动生成对应的查询实现,结构参考如下:

Stream<List<ItemClientJunction>> getItemsWithClients() {
  return _queryAdapter.queryListStream(
    '''
    SELECT junctiont.*, item.*, client.*
    FROM item
    INNER JOIN junctiont
    ON item.id = junctiont.item_id
    INNER JOIN client
    ON junctiont.client_id = client.id
    ''',
    mapper: (Map<String, Object?> row) => ItemClientJunction(
      // Floor会自动根据@Embedded注解映射各实体字段
      junctiont: Junctiont(
        id: row['id'] as int?,
        item_id: row['item_id'] as int,
        client_id: row['client_id'] as int,
        // 其余Junctiont表字段依次映射
      ),
      item: Item(
        id: row['id'] as int?,
        item_id: row['item_id'] as String,
        description: row['description'] as String,
        salePrice: row['sale_price'] as double,
        purchasePrice: row['purchase_price'] as double,
        isActive: row['is_active'] as int,
      ),
      client: Client(
        id: row['id'] as int?,
        // 其余Client表字段依次映射
      ),
    ),
  );
}

最终返回值类型

返回值为Stream<List<ItemClientJunction>>,其中ItemClientJunction是你自定义的包含三张表所有字段的联合实体,你可以直接从这个实体中取出对应表的所有字段使用。

内容的提问来源于stack exchange,提问作者Mohammad Alamoudi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:57:04