如何编写正确的Nest+MySQL查询仅获取所需字段
解决方案
要实现查询freelancer全量数据的同时仅获取users表的单个字段,你可以通过leftJoinAndMapOne结合指定字段选择来实现,同时注意避免SQL注入风险,不要直接拼接ID参数。
正确代码示例
假设你需要获取users表的email字段,代码如下:
.createQueryBuilder('freelancer') .leftJoinAndMapOne( 'freelancer.userEmail', // 将查询到的user.email映射到freelancer的临时属性userEmail 'freelancer.user', 'user' ) .select([ 'freelancer', // 选择freelancer的所有字段 'user.email' // 仅选择users表的email字段 ]) .where('freelancer.userId = :id', { id }) // 参数化查询,避免SQL注入 .getOne()
关键说明
leftJoinAndMapOne的第一个参数是映射目标属性:可以是freelancer实体中已有的字段,也可以是临时创建的属性,用于存储从users表查询到的单个字段值。- 必须在
select中明确指定要获取的字段:如果只写'freelancer'会默认获取其全部字段,但users的字段需要单独指定,否则不会返回。 - 替换字符串拼接ID为参数化查询:直接用
${id}会存在SQL注入风险,使用:id结合参数对象是更安全的写法。
如果你的映射目标是freelancer实体中已有的关联属性(比如user),也可以只映射单个字段到该属性的对应字段,但需要确保实体定义支持部分字段填充。
内容的提问来源于stack exchange,提问作者Mmm
相关产品推荐
相关产品推荐

