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
相关产品推荐
相关产品推荐

