TypeORM Query Builder查询PostgreSQL UUID主键报错:如何将字符串UUID转换为PostgreSQL UUID类型?
解决TypeORM Query Builder查询UUID时的PostgreSQL语法错误
这个问题我之前排查过,核心原因很明确:你传入的:id参数不是纯字符串UUID,而是一个包含id字段的对象——从错误信息里的"{"id":"8f294654-8385-4579-a714-0fae73839430"}"就能直接看出来,PostgreSQL自然没法把这个JSON格式的对象解析成UUID类型。
快速修复方法
你只需要确保传入的id是纯字符串格式的UUID即可,具体分两种情况处理:
如果
id变量是嵌套对象
提取对象里的id字段值,把参数改成纯字符串:// 先从对象中提取纯字符串UUID const actualUUID = id.id; this.repository.createQueryBuilder('products') .leftJoinAndSelect('products.brand', 'brands') .leftJoinAndSelect('products.category', 'categories') .leftJoinAndSelect('products.productOptions', 'productOptions') .where('products.id = :id', { id: actualUUID }) // 传入纯字符串 .getOne()如果是参数传递错误
检查你获取id的来源,比如从HTTP请求参数、DTO对象中取值时,是不是不小心把整个对象传进去了。比如:// 错误示例:拿到了整个params对象 // const id = req.params; // 正确示例:只拿id字段的字符串值 const id = req.params.id; this.repository.createQueryBuilder('products') .leftJoinAndSelect('products.brand', 'brands') .leftJoinAndSelect('products.category', 'categories') .leftJoinAndSelect('products.productOptions', 'productOptions') .where('products.id = :id', { id }) .getOne()
额外建议(可选)
为了避免后续再出现类似问题,可以加一层UUID格式校验:
- 使用正则表达式验证字符串是否符合UUID格式
- 借助
uuid包的validate方法做校验,比如:import { validate } from 'uuid'; if (!validate(actualUUID)) { throw new Error('Invalid UUID format'); }
补充说明
TypeORM本身会自动将合法的字符串UUID转换为PostgreSQL的UUID类型,不需要你手动做类型转换——这次的错误完全是参数传递时的对象/字符串混淆导致的。
内容的提问来源于stack exchange,提问作者funtik




