Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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 hibernate搜索中的多态查询_Java_Hibernate_Hibernate Search - Fatal编程技术网

Java hibernate搜索中的多态查询

Java hibernate搜索中的多态查询,java,hibernate,hibernate-search,Java,Hibernate,Hibernate Search,我试图简化我的问题,我有A级: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public class A { @Field private String a; .... } B类扩展了A类: @Entity @Indexed public class B extends A { @Field private String b; .... } 另一类C扩展了A

我试图简化我的问题,我有A级:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class A {

    @Field
    private String a;
    ....
}
B类扩展了A类:

@Entity 
@Indexed
public class B extends A {


    @Field
    private String b;
    ....
}
另一类C扩展了A:

@Entity 
@Indexed
public class C extends A {


    @Field
    private String c;
    ....
}
我的问题是,当我进行多态查询时,例如:

Query query = queryBuilder.keyword().onField("a").matching(a).createQuery();
它工作得很好,没有问题,但当字段为b或c时,如:

Q
queryquery=queryBuilder.keyword().onField(“b”).matching(b.createQuery()

我有一个例外: org.hibernate.search.SearchException:在C中找不到字段b 是否有任何解决方案,或者我应该执行非多态查询?也许我在什么地方弄错了。
谢谢你的帮助

您基本上达到了查询DSL的限制。目前,它只支持为单个索引类型创建查询。另见

作为一种解决方法,您可以恢复编写本地Lucene查询。多态查询应该可以工作


如果您想要使用DSL,您需要为您想要定位的特定子类创建一个
QueryBuilder
实例

对于存在相同问题的用户,请使用lucene TermQuery:

org.apache.lucene.search.TermQuery termQuery = new TermQuery("field", "term"));
luceneBooleanQuery.add(termQuery, BooleanClause.Occur.MUST);
如果字段是数字(int,double,…),请使用lucene NumericRangeQuery:

NumericRangeQuery<Double> numericQuery = NumericRangeQuery.newDoubleRange("numericField", minRange, maxRange,  true, true);
luceneBooleanQuery.add(numericQuery, BooleanClause.Occur.MUST);
NumericRangeQuery numericQuery=NumericRangeQuery.newDoubleRange(“numericField”,minRange,maxRange,true,true);
luceneBooleanQuery.add(numericQuery,BooleanClause.occurrent.MUST);

私有字段不是继承的,也不是多态性的一部分。不正确。我不认为这是我的问题,因为它说:无法在C中找到字段b!而不是B中的a或C这些查询是在哪个类中定义的?是的,它肯定会抱怨B列,因为它特定于实体B。如果第二个查询的目的是只检索“B”然后,请考虑修改您的HQL或标准,以使其更细粒度,即查询实体B。这将为您节省一些性能,因为您没有查询整个层次。它是Hibernate搜索DSL(Lucene),而不是HQL或标准。这适用于HQL或标准。感谢Hardy,答案很清楚,我只是想知道这是否可行。在创建与每个特定子类相关的查询之前,我已经设置了一些条件。