mirror of
https://github.com/doctrine/orm.git
synced 2026-03-23 22:42:18 +01:00
DDC-512: LEFT JOIN of extended null entity cause empty result [testcase included] #641
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @doctrinebot on GitHub (Apr 12, 2010).
Jira issue originally created by user else:
Dear developers,
I'm not sure about propriety of my query but what i want to do is left
join entity which is associeted by @OneToOne. Problem occur when
associeted entity is NULL. Then i got empty result. I think it's
because my associeted entity is extended so it cause in final SQL
query inner joins which are not in subselect.
class Shop_Data_Entity_StockItem extends Shop_Data_Entity_Item {
/****
* @OneToOne(targetEntity="Shop_Data_Entity_OrderItem",
mappedBy="stockItem")
*/
protected $orderItem;
}
So there's my query:
$q = $em->createQuery("select u from Shop_Data_Entity_StockItem u left
join u.orderItem uu");
echo $q->getSql();
$result = $q->getResult();
count($result[0]);
// print 0 even there're Shop_Data_Entity_StockItem in database and
without left join clause prints 2
There's echo $q->getSql():
SELECT s0_.ean AS ean0, s0_.title AS title1, s0_.description AS
description2, s0_.vat AS vat3, s0_.id AS id4, s1_.bestBefore AS
bestBefore5, s0_.discr AS discr6, s0_.price AS price7,
s1_.deliveryInvoice_id AS deliveryInvoice_id8 FROM
Shop_Data_Entity_StockItem s1_ INNER JOIN Shop_Data_Entity_Item s0_ ON
s1_.id = s0_.id LEFT JOIN Shop_Data_Entity_OrderItem s2_ ON s1_.id =
s2_.stockItem_id INNER JOIN Shop_Data_Entity_OfferItem s3_ ON s2_.id =
s3_.id INNER JOIN Shop_Data_Entity_Item s4_ ON s2_.id = s4_.id
@doctrinebot commented on GitHub (Apr 12, 2010):
Comment created by else:
This test case is slightly different from example i wrote in description but shows same issue
@doctrinebot commented on GitHub (Apr 12, 2010):
Comment created by @guilhermeblanco:
Your report exposes exactly the issue pointed on DDC-349.
We should take a look how to fix this without having to update ALL unit tests that takes advantage of inheritance.
Also, the SQL spec requires that all joins need to be specified before write the ON keyword.
Example:
And in the situation of a inheritance:
@doctrinebot commented on GitHub (Apr 13, 2010):
Comment created by romanb:
I am aware of the problem and yes, nested joins for CTI can be a solution but its just 1 solution. The other one is to simply turn these CTI joins into left joins when they appear in the middle of a query (that is, not in the FROM clause).
So, given a Class hierarchy like this:
and a DQL like this:
We have 2 possible solutions.
Nr. 1: Nested inner join
Nr. 2: Just use left joins for parent tables for all CTI joins that are the result of a DQL join (This is what Hibernate does):
According to DDC-349, most databases seem to support nested inner joins (Nr. 1) but nevertheless its not in the ANSI standard I think, so I am not sure we can rely on it.
The Hibernate solution seems simpler but I still wonder whether they perform differently (Usually, inner joins are more performant than outer joins),
@doctrinebot commented on GitHub (Apr 15, 2010):
Comment created by romanb:
Fixed in
01c2c06bbfusing the "hibernate-way".Please note that you currently should not name join columns the same as entity fields. See DDC-522. Better use @JoinColumn(name="item_id", ...)
@doctrinebot commented on GitHub (Apr 15, 2010):
Issue was closed with resolution "Fixed"
@doctrinebot commented on GitHub (Dec 13, 2015):
Imported 1 attachments from Jira into https://gist.github.com/1f3ea54f624b9fac5e82