休眠搜索中的多态查询
polymorphic queries in hibernate search
我试着简化我的问题,我有 class A :
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class A {
@Field
private String a;
....
}
和 class B 扩展 class A:
@Entity
@Indexed
public class B extends A {
@Field
private String b;
....
}
另一个 class C 扩展了 A :
@Entity
@Indexed
public class C extends A {
@Field
private String c;
....
}
我的问题是,当我进行多态查询时,例如:
Query query = queryBuilder.keyword().onField("a").matching(a).createQuery();
它工作得很好,没问题,但是当字段是 b 或 c 时,像 :
Query query = queryBuilder.keyword().onField("b").matching(b).createQuery();
我有一个例外:
org.hibernate.search.SearchException: 无法在 C 中找到字段 b
有什么解决办法,还是我应该做非多态查询?可能是我在某处出错了。
感谢您的帮助。
您基本上达到了查询 DSL 的限制。目前它只支持为单个索引类型创建查询。另见 HSEARCH-1851。
作为解决方法,您可以恢复为编写本机 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);
我试着简化我的问题,我有 class A :
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class A {
@Field
private String a;
....
}
和 class B 扩展 class A:
@Entity
@Indexed
public class B extends A {
@Field
private String b;
....
}
另一个 class C 扩展了 A :
@Entity
@Indexed
public class C extends A {
@Field
private String c;
....
}
我的问题是,当我进行多态查询时,例如:
Query query = queryBuilder.keyword().onField("a").matching(a).createQuery();
它工作得很好,没问题,但是当字段是 b 或 c 时,像 :
Query query = queryBuilder.keyword().onField("b").matching(b).createQuery();
我有一个例外: org.hibernate.search.SearchException: 无法在 C 中找到字段 b 有什么解决办法,还是我应该做非多态查询?可能是我在某处出错了。 感谢您的帮助。
您基本上达到了查询 DSL 的限制。目前它只支持为单个索引类型创建查询。另见 HSEARCH-1851。
作为解决方法,您可以恢复为编写本机 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);