OR 条件在 JPA 查询中无法正常工作
OR condition doesnt work properly in JPA Query
我有以下实体
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;
现在当我运行查询
select p 来自 ProductUnitOfMeasures p 其中 p.variant.sku=?1 或 p.product.sku =?1
(String 类型的 sku)。
它 return 空列表,虽然 有一些按照下面的 ProductUnitOfMessure table
ProductUnitOfMeasures
当我仅 运行 select p 来自 ProductUnitOfMeasures p where p.product.sku =?1
我得到了一些值,为什么会发生这种情况 即使我使用 OR 不 AND ?
数据库是oracle
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 被考虑,允许您的 ProductUnitOfMeasures 具有空变体但具有与您的过滤器匹配的 product.sku 值仍然被返回。
我有以下实体
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;
现在当我运行查询
select p 来自 ProductUnitOfMeasures p 其中 p.variant.sku=?1 或 p.product.sku =?1 (String 类型的 sku)。
它 return 空列表,虽然 有一些按照下面的 ProductUnitOfMessure table ProductUnitOfMeasures
当我仅 运行 select p 来自 ProductUnitOfMeasures p where p.product.sku =?1 我得到了一些值,为什么会发生这种情况 即使我使用 OR 不 AND ?
数据库是oracle
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 被考虑,允许您的 ProductUnitOfMeasures 具有空变体但具有与您的过滤器匹配的 product.sku 值仍然被返回。