Странная проблема JPQL: добавление менее строгих параметров запроса возвращает меньше строк - PullRequest
2 голосов
/ 18 января 2012

У нас есть такая модель сущности (несвязанные поля для краткости опущены):

@Entity
public class Invoice {
    //The other portion of the sum that is invoiced from another payer.
    @OneToOne(mappedBy = "parentInvoice", cascade = CascadeType.ALL)
    private Invoice otherPayersInvoice;

    //The patient's invoice, which is the parent of this other payer's invoice.
    @OneToOne(cascade = CascadeType.ALL)
    private Invoice parentInvoice;

    @ManyToOne
    private Payer payer;
}

Итак, в основном мы разделим накладные на части и сохраним отношения внутри сущностей.

Следующий запрос работает и возвращает все счета по payerId:

SELECT i FROM Invoice i WHERE i.payer.id = :payerId

Однако, когда я расширяю запрос, чтобы также перечислить все «дочерние» счета-фактуры, которые может иметь плательщик (счета-фактуры от другого плательщика), я вообще не получаю никаких результатов и никаких ошибок или предупреждений.

SELECT i FROM Invoice i WHERE i.payer.id = :payerId OR
    (i.parentInvoice IS NOT NULL AND i.parentInvoice.payer.id = :payerId)

В чем может быть проблема здесь?

1 Ответ

2 голосов
/ 18 января 2012
i.parentInvoice.payer.id

Это соединение INNER от Invoice к его родителю и плательщику, которое отфильтрует все строки без родителя или плательщика.

Вместо этого вам нужно использовать external-join.

SELECT i FROM Invoice i join i.parentInvoice parent join p.payer parentPayer join i.payer payer WHERE payer.id = :payerId OR (parentPayer.id = :payerId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...