@Override public PageVO<AiChatVO> queryChatPage(AiChatReq aiChatReq) { SysCacheUserDto adminUserInfo = getAdminUserInfo(); return select(aiChatMapper) .where() .eq(AiChat::getUserId,adminUserInfo.getId()) .orderDesc(AiChat::getCreateTime) .page(aiChatReq, AiChatVO.class); } @Override public Map<Long,ChatRecordMsgJsonDto> queryMsg(List<Long> ids) { if (CollectionUtils.isEmpty(ids)){ return Map.of(); } return where(aiChatRecordMsgMapper) .in(BaseDO::getId, ids) .hasMap( BaseDO::getId, v-> JSONObject.parseObject(v.getMsgDetail().toString(),ChatRecordMsgJsonDto.class) );
var users = dbContext.Users .Where(u => u.Age > 18) .OrderBy(u => u.Name) .ToList(); users.First().Name = "zhangsan"; dbContext.Save();
再之后就是传统的围绕 Entity 的 ORM 。这一类 ORM 都内置了丰富的 EntityManager | Repository 的功能,SQL Builder 功能只是作为兜底方案。这类 ORM 的通病是 Repository API 无法满足所有的 SQL 写法,到头来还是得写 SQL 。
Prisma 的主要槽点是:使用自己发明的 Prisma Schema 用于定义表结构、使用自己发明的 Repository API 用于读写数据库,后果是增加了学习成本,隐藏了许多细节碰到问题了不太容易排查;
rails 这么叼吗
https://zio.dev/zio-quill/
https://typelevel.org/doobie/
Rust 的 SQLx
https://github.com/launchbadge/sqlx
我看中的是类型安全,编译期错误检查。不要有自作聪明的 DSL ,越接近 raw SQL 越好。
因为 SQL 才是真正通用的知识,任何妄图在编码中曲解或隐藏 SQL 的 ORM 框架我觉得都是垃圾。(此处点名批评 Hibernate 与同类框架)
delphi 的 bed ,一个 grid 包含所有批量 单行,单格 增删改查 分页,滚动加载,一行代码不用写。
linq 语法、状态跟踪等等
举个简单的例子,就这个简单的例子很多语言都实现的很丑
Drizzle > Kysely > Orchid ORM >> MikroORM > Prisma > TypeORM
Drizzle 、Kysely 已经是版本答案了:没有太花哨的功能,只需要写 SQL ,ORM | SQL Builder 将给你类型安全的查询结果。
Kysely 只是一个 SQL Builder ,类型安全方面做得也是最好的; Drizzle 在 SQL Builder 的基础上加了表结构定义,能满足表迁移的许多工作,因此把 Drizzle 排在 Kysely 前面。
Orchid ORM 非常小众,除了 SQL Builder 和表结构定义还加了许多 EntityManager | Repository 的糖,但主要还是以 SQL Builder 为主。
再之后就是传统的围绕 Entity 的 ORM 。这一类 ORM 都内置了丰富的 EntityManager | Repository 的功能,SQL Builder 功能只是作为兜底方案。这类 ORM 的通病是 Repository API 无法满足所有的 SQL 写法,到头来还是得写 SQL 。
Prisma 的主要槽点是:使用自己发明的 Prisma Schema 用于定义表结构、使用自己发明的 Repository API 用于读写数据库,后果是增加了学习成本,隐藏了许多细节碰到问题了不太容易排查;
根本不能算模型定义的模型
migration 根本没法用
简单的保存是有了 id 还用要 id 执行一遍查询,然后再更新,然后在获取更新后的结果
事务直接放数组里面:
const [posts, totalPosts] = await prisma.$transaction([
prisma.post.findMany({ where: { title: { contains: 'prisma' } } }),
prisma.post.count(),
])
rails 这么叼吗