Doctrine执行DQL查询count(*)时报Expected Literal, got '*'错误
错误原因
Doctrine 使用的 DQL 是面向实体对象的查询语言,语法规则和原生 SQL 存在差异:它不支持直接在 count() 中使用 * 通配符作为统计参数,DQL 解析器无法将 * 映射到对应的实体属性,因此会抛出「期望得到字面量,实际得到 *」的语法错误。
正确的统计写法
有几种常用的实现方案可选:
方案1:给实体设置别名,直接统计实体对象(通用写法)
给Courrier实体设置别名后直接统计别名即可,Doctrine会自动基于实体主键统计总条数,搭配getSingleScalarResult()可以直接拿到整型的统计结果,不需要额外处理数组:$query = $this->em->createQuery('SELECT count(c) FROM App\Entity\Courrier c'); $countCourrier = $query->getSingleScalarResult();方案2:显式统计实体主键字段(性能更优)
直接指定统计实体的主键字段(假设主键字段为id),可以减少Doctrine的映射解析开销:$query = $this->em->createQuery('SELECT count(c.id) FROM App\Entity\Courrier c'); $countCourrier = $query->getSingleScalarResult();方案3:调用Repository自带计数方法(最简写法)
无自定义查询条件的场景下,可以直接调用Repository封装的count()方法,不需要手写DQL:$countCourrier = $this->em->getRepository(\App\Entity\Courrier::class)->count([]);
内容的提问来源于stack exchange,提问作者Majo
相关产品推荐
相关产品推荐

