Kotlin Room一对多关联场景如何通过SQL实现关联列表按createdAt排序
一、默认排序规则
Room的@Relation注解默认未指定排序逻辑,底层会先执行你写的User查询,再自动生成一条SELECT * FROM Playlist WHERE userCreatorId IN (查询到的所有userId) 语句获取关联的播放列表。
这条自动生成的语句不带ORDER BY子句,此时SQLite会默认按Playlist表的主键(play_list_id)升序返回结果,但该行为是SQLite的底层实现决定的,不属于Room的规范承诺,不建议业务逻辑依赖默认排序。
二、Dao层实现按createdAt排序的方法
最简单的方案是直接用@Relation自带的sortBy参数指定排序规则,不需要修改原有的Dao查询语句:
data class UserWithPlaylists( @Embedded val user: User, @Relation( parentColumn = "userId", entityColumn = "userCreatorId", // 注意:sortBy填数据库列名,不是实体类属性名,DESC代表倒序,升序可省略DESC sortBy = "created_at DESC" ) val playlists: List<Playlist> )
Room生成代码时会自动在关联查询Playlist的语句中加上ORDER BY created_at DESC,返回的playlists列表就会按创建时间倒序排列。
如果需要动态调整排序规则,也可以手动写联合查询+自定义映射逻辑,但绝大多数场景下上述sortBy参数的方案足够使用,性能和原生查询一致。
内容的提问来源于stack exchange,提问作者William Hu
相关产品推荐
相关产品推荐

