JOOQ如何按字段分组查询返回Map<String, List<Message>>结构?
实现方案
方案1:使用JOOQ内置fetchGroups方法(推荐,性能更优)
直接利用JOOQ结果集处理阶段的分组能力,无需额外转换,适合大部分场景:
fun getAllForUsernames(usernames: List<String>): Map<String, List<Message>> = dsl.selectFrom(Messages.MESSAGES) .where(Messages.MESSAGES.USERNAME.`in`(usernames)) .fetchGroups(Messages.MESSAGES.USERNAME, Message::class.java)
方案2:配合Kotlin标准库分组(更灵活)
如果需要先对查询结果做自定义处理再分组,可以先转POJO再用Kotlin集合API分组:
fun getAllForUsernames(usernames: List<String>): Map<String, List<Message>> = dsl.selectFrom(Messages.MESSAGES) .where(Messages.MESSAGES.USERNAME.`in`(usernames)) .fetchInto(Message::class.java) .groupBy { it.username }
注意事项
- 需保证
Message类的字段与JOOQ生成的Messages表字段命名匹配,否则字段映射会失败,也可通过ConstructorProperties注解手动指定映射关系 - 若
username字段存在空值,返回的Map会包含null键,可通过追加.filterKeys { it != null }过滤空键
内容的提问来源于stack exchange,提问作者Вячеслав Чернышов
相关产品推荐
相关产品推荐

