hibernate搜索中的多态查询

时间:2015-05-12 19:00:27

标签: 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:

@Entity 
@Indexed
public class C extends A {


    @Field
    private String c;
    ....
}

我的问题是,当我做多态性查询时:

Query query = queryBuilder.keyword().onField("a").matching(a).createQuery();

它工作得很好,没问题,但是当字段是b或c时:

Q uery query = queryBuilder.keyword().onField("b").matching(b).createQuery();

我有一个例外: org.hibernate.search.SearchException:无法在C中找到字段b 有没有解决方案,或者我应该做非多态查询?可能是某个地方我有错。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您基本上是在限制查询DSL。目前它仅支持为单个索引类型创建查询。另请参阅HSEARCH-1851

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

如果要使用DSL,则需要为要定位的特定子类创建QueryBuilder实例。

答案 1 :(得分:0)

对于那些有同样问题的人,请使用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);