Nie dostaję wyników w prostym zapytania JPA Query.

Nie dostaję wyników w prostym zapytania JPA Query.
  • Rejestracja: dni
  • Ostatnio: dni
0

Zapytanie, które nie zwraca mi wyników:

Kopiuj
@NamedQuery(name="Order.requestsForMyMaterial", query="SELECT o FROM Order o WHERE o.part.partOwner = :user OR o.sampleorder.depositOwner = :user")  

Natomiast dwa osobne zapytania zwracają mi poprawnie wynik zawarty w WHERE, ale połączone warunki OR nie dają rezultatów.

Kopiuj
@NamedQuery(name="Order.requestsForMyMaterial", query="SELECT o FROM Order o WHERE o.part.partOwner = :user")  
Kopiuj
@NamedQuery(name="Order.requestsForMyMaterial", query="SELECT o FROM Order o WHERE o.sampleorder.depositOwner = :user")  
Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6822
0

Sprawdź co jest generowane pod spodem - jaki SQL idzie do bazy. IMO, robiony jest jakiś "dziwny" JOIN, który wycina dane.

  • Rejestracja: dni
  • Ostatnio: dni
0

Tworzony jest taki SQL:

Kopiuj
SELECT t1.IDORDER,
       t1.DATE,
       t1.INFOSTATUS,
       t1.ORDERTYPE,
       t1.RECEIPTDATE,
       t1.REQUESTEDMASS,
       t1.RETURNINGMASS,
       t1.RETURNINGMASSEL,
       t1.STATE,
       t1.STATEPNMBEFORE,
       t1.STATEQUANTITYBEFORE,
       t1.USERGOAL,
       t1.WAREHOUSEPNMBEFORE,
       t1.WAREHOUSEQUANTITYBEFORE,
       t1.WASTEPNMBEFORE,
       t1.WASTEQUANTITYBEFORE,
       t1.ordering,
       t1.part,
       t1.sampleorder
FROM Part t0,
     Sample t2,
     Orderr t1
WHERE (((t0.partOwner = ?)
        OR (t2.depositOwner = ?))
       AND ((t0.IDPART = t1.part)
            AND (t2.IDSAMPLE = t1.sampleorder)))

Zmieniłem nawet zapytanie, by nie porównywać obiektu tylko id:

Kopiuj
SELECT o FROM Order o WHERE o.part.partOwner.idUser = :user OR o.sampleorder.depositOwner.idUser = :user 

Wytwarzany SQL to:

Kopiuj
SELECT t1.IDORDER,
       t1.DATE,
       t1.INFOSTATUS,
       t1.ORDERTYPE,
       t1.RECEIPTDATE,
       t1.REQUESTEDMASS,
       t1.RETURNINGMASS,
       t1.RETURNINGMASSEL,
       t1.STATE,
       t1.STATEPNMBEFORE,
       t1.STATEQUANTITYBEFORE,
       t1.USERGOAL,
       t1.WAREHOUSEPNMBEFORE,
       t1.WAREHOUSEQUANTITYBEFORE,
       t1.WASTEPNMBEFORE,
       t1.WASTEQUANTITYBEFORE,
       t1.ordering,
       t1.part,
       t1.sampleorder
FROM Part t0,
     Sample t2,
     Orderr t1
WHERE (((t0.partOwner = ?)
        OR (t2.depositOwner = ?))
       AND ((t0.IDPART = t1.part)
            AND (t2.IDSAMPLE = t1.sampleorder)))

o.part i o.sampleorder jest nullable jeśli to ma znaczenie.

Jak zapisać JPQLa by uzyskać efekt którego szukam?

SZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 616
0

Jawnie określ JOIN'y

SELECT o FROM ORDER o JOIN o.part p JOIN p.partOwner po WHERE po.idUser = :USER OR o.sampleorder.depositOwner.idUser = :USER

  • Rejestracja: dni
  • Ostatnio: dni
0
Szczery napisał(a):

Jawnie określ JOIN'y

SELECT o FROM ORDER o JOIN o.part p JOIN p.partOwner po WHERE po.idUser = :USER OR o.sampleorder.depositOwner.idUser = :USER

Zmieniłem zapytanie na takie i też nie otrzymałem żadnego wyniku. SQL:

Kopiuj
SELECT t1.IDORDER,
       t1.DATE,
       t1.INFOSTATUS,
       t1.ORDERTYPE,
       t1.RECEIPTDATE,
       t1.REQUESTEDMASS,
       t1.RETURNINGMASS,
       t1.RETURNINGMASSEL,
       t1.STATE,
       t1.STATEPNMBEFORE,
       t1.STATEQUANTITYBEFORE,
       t1.USERGOAL,
       t1.WAREHOUSEPNMBEFORE,
       t1.WAREHOUSEQUANTITYBEFORE,
       t1.WASTEPNMBEFORE,
       t1.WASTEQUANTITYBEFORE,
       t1.ordering,
       t1.part,
       t1.sampleorder
FROM Sample t3,
     USER t2,
          Orderr t1,
          Part t0
WHERE (((t0.partOwner = ?)
        OR (t3.depositOwner = ?))
       AND (((t0.IDPART = t1.part)
             AND (t3.IDSAMPLE = t1.sampleorder))
            AND (t2.IDUSER = t0.partOwner)))

Póki co zrobiłem dwa odrębne zapytania i je połączyłem (suma List), aczkolwiek to niezbyt eleganckie rozwiązanie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.