Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按子类属性休眠JPA筛选器_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 按子类属性休眠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

我有以下JPA实体

@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);