[英]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
不能同時是OrderItemTypeOne
和OrderItemTypeTwo
的實例。
另一種方法是使用這種方式交叉連接
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.