簡體   English   中英

按子類屬性 Hibernate JPA 過濾器

[英]Hibernate JPA Filter by Subclass Properties

我有以下 JPA 實體,

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class OrderItem {

    // some inherited fields

}
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue("TYPE1")
public class OrderItemTypeOne extends OrderItem {

    @OneToOne(mappedBy = "orderItem")
    @JsonManagedReference
    private SomeTypeA a;

}
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorValue("TYPE2")
public class OrderItemTypeTwo extends OrderItem {

    @OneToOne(mappedBy = "orderItem")
    @JsonManagedReference
    private SomeTypeB b;

}

我想執行一個查詢,在一個 JPA 查詢中為我提供所有 OrderItem,其中 a = 'a'(對於 OrderItemTypeOne)和 b = 'b'(對於 OrderItemTypeTwo)。 我怎樣才能做到這一點? 到目前為止,我有這個查詢,但它在運行時給出了 SQLGrammarException。

@Query("SELECT oi FROM OrderItem oi "
            + "LEFT JOIN OrderItemTypeOne t1 "
            + "LEFT JOIN OrderItemTypeTwo t2 "
            + "WHERE t1.a = :a "
            + "AND t2.b = :b")
Page<OrderItem> findOrders(@Param("a") String a, @Param("b") String b);

我試過使用這種方法,

@Query("SELECT oi FROM OrderItem oi "
            + "WHERE treat(oi as OrderItemTypeOne).a = :a "
            + "AND treat(oi as OrderItemTypeTwo).b = :b")
Page<OrderItem> findOrders(@Param("a") String a, @Param("b") String b);

但這不起作用,因為treat() 僅在我提供子屬性時才有效,例如treat(oi.someOtherProperty as SomeOtherType)

任何指導將不勝感激!

我懷疑你應該使用or -clause 而不是and here

 select oi 
 from OrderItem oi 
 where treat(oi as OrderItemTypeOne).a=:a or treat(oi as OrderItemTypeTwo).b=:b

當您使用and -clause 時,您什么也得不到,因為OrderItem不能同時是OrderItemTypeOneOrderItemTypeTwo的實例。

另一種方法是使用這種方式交叉連接

select oi 
from OrderItem oi, OrderItemTypeOne t1, OrderItemTypeTwo t2
where (oi.id=t1.id or oi.id=t2.id) and (t1.a=:a or t2.b=:b)

其中oi.id - OrderItem id 字段名稱

使用以下內容:

@Query("SELECT oi FROM OrderItem oi "
            + "WHERE oi.a = :a "
            + "OR oi.b = :b")
Page<OrderItem> findOrders(@Param("a") String a, @Param("b") String b);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM