我有以下物體
class ProductUnitOfMessure
@ManyToOne
@JoinColumn(name="PRODUCT_ID")
private Product product;
@ManyToOne
@JoinColumn(name="VARIANT_ID")
private Variant variant;
class Product
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY)
List<Variant> variants;
class Variant
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PRODUCT_ID")
private Product product;
現在當我運行查詢
從 ProductUnitOfMeasures p 中選擇 p,其中 p.variant.sku=?1 或 p.product.sku =?1 (字串型別的 sku )。
它回傳空串列,盡管有一些按照下面的 ProductUnitOfMessure 表 ProductUnitOfMeasures
當我只從 ProductUnitOfMeasures p where p.product.sku =?1 運行 select p時, 我得到了一些值,為什么即使我使用 OR not AND也會發生這種情況?
資料庫是oracle
uj5u.com熱心網友回復:
指定“.”時,JPA 強制內部連接用于參考。默認情況下在關系上。內部連接會自動從結果中排除空值 - 如果您呼叫 ProductUnitOfMeasures.getVariant().getSku() == youValue,這可能與您可能想要的內容一致,因為您不想處理 NPE。如果您希望在結果中包含空值,則資料庫具有所謂的外連接語意,它允許包含空值的行并仍用于過濾器的其余部分。
就像是:
"select p from ProductUnitOfMeasures p left join p.variant variant left join p.product product where variant.sku = ?1 or product.sku = ?1"
將允許仍考慮具有空變體或空產品參考的 ProductUnitOfMeasures,允許仍回傳具有空變體但具有與您的過濾器匹配的 product.sku 值的 ProductUnitOfMeasures。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424538.html
