java - 奇怪的 JPQL 问题 : adding less restrictive query parameters returns less rows

标签 java jpa jpql

我们有一个像这样的实体模型(为简洁起见省略了不相关的字段):

@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)

这可能是什么问题?

最佳答案

i.parentInvoice.payer.id

这是在执行从 Invoice 到其父级到其付款人的 INNER 联接,这将过滤没有父级或付款人的所有行。

您需要改用外连接。

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)

关于java - 奇怪的 JPQL 问题 : adding less restrictive query parameters returns less rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905929/

相关文章:

java - 使用 Camel-Case 的 Hibernate 空属性值

java - JDialog打开速度很慢

java - HH 日期时间格式问题

java - 使用 JPA 的 createNativeQuery() 方法有什么缺点吗

java - 在 Spring 规范中渴望获取

mysql - MySQL 中的排行榜排名,查看器位于结果集中间

sql - 我需要使用 join fetch,但它会导致 "query specified join fetching, but the owner of the fetched association was not present in the select list"

java - 不使用循环搜索字符串数组

java - 使用java在play框架模板中发送Session

java - Spring JPA 映射 - 第一步