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 等效项是啥?

Doctrine Orm 2 使用本机 SQL 的递归查询

SQL语句对返回的结果集里的字段再进行条件查询,在一个结果集显示

VB6 与 C# 以不同顺序返回的 SQL 结果集

存储过程中的动态 SQL 不返回结果集;在 SSMS 中运行时,我得到了结果