DQL 和等效 SQL 不返回相同数量的结果集
Posted
技术标签:
【中文标题】DQL 和等效 SQL 不返回相同数量的结果集【英文标题】:DQL And Equivalent SQL Not Returning Same Number Of Result Set 【发布时间】:2014-09-08 21:04:45 【问题描述】:这是我的学说查询运行代码:
$queryString = "SELECT ct, count(ct.id), IDENTITY(a.service) "
. "FROM ConnectionTriple ct "
. "JOIN ct.account_connection ac "
. "JOIN Account a WITH (a = ac.account_1 OR a = ac.account_2) "
. "GROUP BY a.service, ct.property, ct.value";
$query = $em->createQuery($queryString);
//echo $query->getSQL();
$results = $query->getResult();
echo count($results);
上面的代码返回 2 个结果(屏幕截图下方的最后两个)而不是 4 个(预期)。但是,当我在 phpmyadmin 上运行等效的 SQL(由 $query->getSQL() 获取)时,它返回预期的 4 行,如下所示:
等效的 SQL 查询:
SELECT u0_.id AS id0, u0_.value AS value1, u0_.status AS status2, u0_.flag AS flag3, count(u0_.id) AS sclr4, u1_.service_id AS sclr5, u0_.property_id AS property_id6, u0_.account_connection_id AS account_connection_id7 FROM usc_connection_triple u0_ INNER JOIN usc_account_connection u2_ ON u0_.account_connection_id = u2_.id AND (u2_.status = 1) INNER JOIN usc_service_subscriber u1_ ON ((u1_.id = u2_.account_1_id OR u1_.id = u2_.account_2_id)) WHERE (u0_.status = 1) AND (u1_.status = 1) GROUP BY u1_.service_id, u0_.property_id, u0_.value
PHPMyAdmin 结果:
所以,我猜,我猜,根据学说,物体水合的结果有问题。任何人都知道为什么会发生这种情况/可能的解决方案?
我的教义版本是:
"doctrine/dbal": "2.3.2",
"doctrine/orm": "2.3.2",
更新:我确定水合作用问题。因为,我尝试使用单个列检索和使用标量水合:
$results = $query->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR);
这是完美的回归。这是预期的行数,4 和数据。
【问题讨论】:
您知道如果有不止一行,那么不在GROUP BY
或聚合中的列会返回一个“随机”值,对吧?几乎所有其他 RDBMS 都会为此语句抛出语法错误。我不知道它会影响您的问题,但您需要注意这一点。
感谢您的意见。但是,我在 mysql 方面没有任何问题,并且随着我的更新,我很确定问题出在学说库方面。我会尽快尝试升级版本,看看有没有运气。
仅作记录:当你遇到这样的错误时,请检查你是否指向正确的数据库,以免花几个小时试图指出 Doctrine 代码有什么问题,只是意识到这是错误的数据库(就像我刚刚做的那样)。 :D
【参考方案1】:
我会说这是完全正常的。
正如您所指出的,学说(默认)水合模式会将结果集表示为对象图。
一个对象图总是有一个根对象(在你的例子中是ConnectionTriple ct
)。
您的结果集中有 2 ct(id 为 1 和 2)。
Doctrine 对象水合器将足够聪明地返回您和阵列
2 个 ConnectionTriple 对象,每行包含相关数据。
标量水合器将简单地返回原始结果集,而无需从中构建图表。
【讨论】:
以上是关于DQL 和等效 SQL 不返回相同数量的结果集的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate ScrollableResults 不返回整个结果集
MySQL FOUND_ROWS() 方法的 SQL 等效项是啥?