如何将指定SQL查询转换为Prisma查询?需支持take分页
将目标SQL转换为Prisma查询的两种方案
方案1:用Prisma内置的自定义排序(无需原生查询)
从Prisma 4.10版本开始,findMany的orderBy支持通过_expr定义自定义排序表达式,刚好可以复现你SQL里的排序逻辑,还能直接用take做分页:
const posts = await prisma.posts.findMany({ orderBy: { _expr: `LEAST(CASE WHEN replyto IS NULL THEN id ELSE replyto END, id)`, }, take: 10, // 每页取10条数据 // skip: 20, // 翻页时用,比如第3页就跳过前20条 })
这种方式完全用Prisma的ORM语法,不用写原生SQL,分页逻辑也和常规查询保持一致。
方案2:原生查询(兼容所有Prisma版本)
如果你的Prisma版本比较旧,不支持_expr,那就只能用原生查询。直接在SQL里加上LIMIT和OFFSET来对应take和skip实现分页:
const pageSize = 10; const pageNumber = 1; const skip = (pageNumber - 1) * pageSize; const posts = await prisma.$queryRaw` SELECT * from posts ORDER BY LEAST( CASE WHEN ISNULL(replyto) THEN id ELSE replyto END, id ) LIMIT ${pageSize} OFFSET ${skip}; `;
这里直接复用了你原有的SQL逻辑,只是补充了分页参数,灵活性很高。
注意事项
- 优先选方案1,更贴合Prisma的使用规范,代码可读性更好。
- 如果用方案1,要确保你的Prisma版本在4.10及以上,旧版本不支持
_expr排序。
内容的提问来源于stack exchange,提问作者exebook
相关产品推荐
相关产品推荐

