Room DAO多字段更新编译错误求助:SQLite语句在第三方工具可用
解决Room DAO中多字段UPDATE语句编译错误的问题
这问题我之前踩过坑!虽然你写的SQL在原生SQLite里能正常运行,但Room的SQL解析器对这种多字段批量赋值的语法支持有局限,导致编译报错。下面给你两种可行的解决方案:
方案1:拆分为多个标量子查询赋值
把原来的多字段子查询拆成两个独立的标量子查询,分别给field1和field2赋值,这种写法Room完全支持:
@Query("UPDATE table1 " + " SET field1 = (SELECT SUM(table2.foreign_field1) " + " FROM table2 " + " WHERE table1.id = table2.id " + " GROUP BY table2.foreign_field2), " + " field2 = (SELECT table2.foreign_field2 " + " FROM table2 " + " WHERE table1.id = table2.id " + " GROUP BY table2.foreign_field2)") void setFieldsInTable1();
⚠️ 注意:要确保每个子查询只会返回单行结果,否则会触发SQLite的subquery returns 2 or more rows错误,你的GROUP BY table2.foreign_field2应该已经保证了这一点,不过建议测试验证。
方案2:使用JOIN方式更新(推荐)
用子查询预先聚合table2的数据,再通过JOIN关联table1进行更新,这种写法逻辑更清晰,也是Room官方支持的语法:
@Query("UPDATE table1 " + " SET field1 = t2.summaryForeign_field1, field2 = t2.foreign_field2 " + " FROM (SELECT id, SUM(foreign_field1) as summaryForeign_field1, foreign_field2 " + " FROM table2 " + " GROUP BY id, foreign_field2) t2 " + " WHERE table1.id = t2.id") void setFieldsInTable1();
为什么原来的写法会报错?
Room的SQL验证器并没有完全兼容SQLite的所有扩展语法,你用的SET (field1, field2) = (subquery)属于SQLite特有的多字段赋值语法,目前Room还没适配这种写法,所以会出现编译错误。而DB Browser for SQLite直接用的原生SQLite引擎,所以能正常执行。
内容的提问来源于stack exchange,提问作者N1234
相关产品推荐
相关产品推荐

