I have a Department entity with two optional @ManyToOne fields "faxLinkedTo" 
and "phoneNumberLinkedTo" that optionally refer to another Department whose 
phone number of fax can be used.

I am writing a query to find out the names of departments that refer to either 
the fax or phone number of a given department using the following JPQL:

SELECT d.name, d.faxLinkedTo.id, d.phoneNumberLinkedTo.id
FROM Department d
WHERE d.faxLinkedTo.id IN (:departments) OR d.faxLinkedTo IS NULL OR
               d.phoneNumberLinkedTo.id IN (:departments) OR 
d.phoneNumberLinkedTo IS NULL
ORDER BY d.name

As a test case I let department A link it's fax to department B by setting  
A.faxLinkedTo = B, while having A.phoneNumberLinkedTo = null.
When I run the query to find departments linking to department B, I expect it 
to return a row for A.

However I get an empty result because OpenJPA generates query with two inner 
joins and the phoneNumberLinkedTo field is null.

I would expect the native query to use no joins at all and just do a simple 
select on the Department table.

Is this a bug or am I doing something wrong? Is there a way to let OpenJPA 
generate the correct query?

Or should I simply use two separate queries, one for faxLinkedTo and 
phoneNumberLinkedTo?


SELECT t0.NAME,
       t1.id,
       t2.id
FROM   dbo.crm_department t0
       INNER JOIN dbo.crm_department t1
               ON t0.faxlinkedto_id = t1.id
       INNER JOIN dbo.crm_department t2
               ON t0.phonenumberlinkedto_id = t2.id
WHERE  ( t0.faxlinkedto_id IN ( ? )
          OR t0.faxlinkedto_id IS NULL
          OR t0.phonenumberlinkedto_id IN ( ? )
          OR t0.phonenumberlinkedto_id IS NULL )
ORDER  BY t0.NAME ASC



Regards,
Henno Vermeulen

Reply via email to