如何在KTORM中通过Join实现GroupingBy?查询N关联M的数量
KTORM实现多对多关联查询并统计关联数量
对应你给出的SQL,KTORM完全支持连接操作与聚合分组结合使用,具体实现如下:
1. 定义表实体
先根据你的数据库表结构,定义KTORM对应的表对象:
object Ns : Table<Nothing>("N") { val id = int("id").primaryKey() val name = varchar("name") // 示例字段,根据实际表结构补充 // 其他字段... } object Ms : Table<Nothing>("M") { val id = int("id").primaryKey() val nId = int("n_id").references(Ns) // 关联N表的外键字段 // 其他字段... }
2. 编写查询代码
// 假设database是你的KTORM Database实例 val queryResult = database.from(Ns) // 左连接M表,指定关联条件 .leftJoin(Ms, on = Ns.id eq Ms.nId) // 选择N的所有字段,加上M.id的统计数并起别名 .select(Ns.columns + count(Ms.id).aliased("m_count")) // 按N的id分组 .groupBy(Ns.id) // 将查询结果映射为自定义实体(包含统计数量) .map { row -> // 根据你的实体类结构调整,示例如下: NEntity( id = row[Ns.id], name = row[Ns.name], mCount = row.getInt("m_count") ) }
注意事项
- 如果使用PostgreSQL等严格遵循SQL标准的数据库,需要将N表所有非聚合字段加入分组,此时把
groupBy(Ns.id)改为groupBy(*Ns.columns.toTypedArray())即可。 - 也可以手动指定要查询的N表字段,替代
Ns.columns,比如select(Ns.id, Ns.name, count(Ms.id).aliased("m_count")),更灵活控制返回字段。
内容的提问来源于stack exchange,提问作者Frischling
相关产品推荐
相关产品推荐

