如何在Mikro-ORM QueryBuilder中添加CASE表达式并转换指定SQL
转换SQL到Mikro-ORM QueryBuilder并添加自定义字段的实现方法
一、目标SQL的QueryBuilder写法
假设你的实体类分别是SipIdentity(对应表sip_identity,别名si)和SipMapping(对应表sip_mapping),以下是对应的QueryBuilder实现:
方式1:利用实体关联关系(推荐)
如果SipIdentity实体中已经定义了与SipMapping的关联(比如OneToMany类型的sipMappings属性),可以直接通过关联名称关联表:
const qb = orm.em.createQueryBuilder(SipIdentity, 'si'); // 左关联sip_mapping表 qb.leftJoin('si.sipMappings', 'sip_mapping') // 选择主表所有字段 .select('si.*') // 添加自定义case表达式字段 .addSelect(`CASE WHEN sip_mapping.sip_identity_id IS NOT NULL THEN 'false' ELSE 'true' END`, 'available'); // 执行查询,返回原始数据库行结果 const result = await qb.execute();
方式2:手动指定关联条件
如果没有定义实体关联,可以手动写关联条件:
const qb = orm.em.createQueryBuilder(SipIdentity, 'si'); qb.leftJoin(SipMapping, 'sip_mapping', 'sip_mapping.sip_identity_id = si.id') .select('si.*') .addSelect(`CASE WHEN sip_mapping.sip_identity_id IS NOT NULL THEN 'false' ELSE 'true' END`, 'available'); const result = await qb.execute();
二、如何通过QueryBuilder添加新字段
Mikro-ORM QueryBuilder通过addSelect方法实现自定义字段添加,核心用法:
- 第一个参数传入自定义SQL表达式(比如CASE语句、聚合计算、拼接字段等)
- 第二个参数指定字段别名,方便后续读取结果时调用
注意事项:
- 使用
execute()执行查询,返回的是原始数据库行对象,会完整包含你添加的自定义字段 - 如果使用
getResult(),返回的是实体类实例,但实体类未定义的自定义字段不会被映射到实例属性上,这种场景建议用execute()获取原始数据
内容的提问来源于stack exchange,提问作者Jorge González Villanueva
相关产品推荐
相关产品推荐

