Java 按子类属性休眠JPA筛选器
我有以下JPA实体Java 按子类属性休眠JPA筛选器,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我有以下JPA实体 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) public abstract class OrderItem { // some inherited fields } 我想执行一个查询,在一个JPA查询中提供所有Orde
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class OrderItem {
// some inherited fields
}
我想执行一个查询,在一个JPA查询中提供所有OrderItems,其中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(“从OrderItem oi中选择oi”
+“左连接OrderItemTypeOne t1”
+“左连接OrderItemTypeTwo t2”
+“其中t1.a=:a”
+“和t2.b=:b”)
页面查找程序(@Param(“a”)字符串a、@Param(“b”)字符串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);
@Query(“从OrderItem oi中选择oi”
+“其中,将(oi作为OrderItemTypeOne处理)。a=:a”
+“并将(oi视为OrderItemTypeTwo.b=:b”)
页面查找程序(@Param(“a”)字符串a、@Param(“b”)字符串b);
但这不起作用,因为treat()仅在我提供子属性时起作用,例如,treat(oi.someOtherProperty作为SomeOtherType)
任何指导都将不胜感激 我想您应该在这里使用
或-子句而不是和
select oi
from OrderItem oi
where treat(oi as OrderItemTypeOne).a=:a or treat(oi as OrderItemTypeTwo).b=:b
当您使用和-子句时,您将一无所获,因为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);
@Query(“从OrderItem oi中选择oi”
+“其中oi.a=:a”
+“或oi.b=:b”)
页面查找程序(@Param(“a”)字符串a、@Param(“b”)字符串b);
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)
@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);