使用带有关联枚举字段的 hibernate-search 查询结果
query results with hibernate-search with associated enumeration field
我正在尝试为具有以下关联的实体创建文档索引:
文档版本:
@Entity
@Indexed
public class DocVersion implements Serializable {
...
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "doc_uuid")
@IndexedEmbedded
private Document2 document2;
...
}
文档 2:
@Entity
@Indexed
public class Document2 implements Serializable {
...
@Column(name = "entityState")
@Enumerated(EnumType.STRING)
@Field(bridge=@FieldBridge(impl=EnumBridge.class), index=Index.YES)
private EDocState eDocState;
...
}
这是我查询索引的方式(仅用于测试目的):
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
try {
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder()
.forEntity(DocVersion.class)
.get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword()
.onField("document2.eDocState").matching("HARD_DEL")
.createQuery();
List results = fullTextEntityManager.createFullTextQuery(luceneQuery, DocVersion.class)
.getResultList();
但我得到的不是结果:
WARNING: org.hibernate.search.bridge.BridgeException: Exception while calling bridge#objectToString
entity class: com.nws.vedica.model.entity.DocVersion
entity property path: document2.eDocState
field bridge: TwoWayString2FieldBridgeAdaptor [stringBridge=org.hibernate.search.bridge.builtin.EnumBridge@60942b8b]
那是什么意思呢?我是否需要为 Enumeration 实现一些特定的桥(它看起来像什么)?
这只是值枚举,所以我认为问题出在其他地方。
请协助我获取结果。
我正在使用的包:
休眠搜索 orm:5.9.3.
您不需要实现特定的桥,实际上恰恰相反:桥已经存在,因此 Hibernate Search 希望您将枚举值传递给查询,而您传递的是字符串值。
尝试将 .matching("HARD_DEL")
替换为 .matching(EDocState.HARD_DEL)
。
注意:我怀疑堆栈跟踪的其余部分会告诉您一些有关 class 转换异常的信息,这可能会提示您。为了您自己的利益,您可能不应该那样隐藏堆栈跟踪,堆栈跟踪可能包含有价值的信息。
我正在尝试为具有以下关联的实体创建文档索引:
文档版本:
@Entity
@Indexed
public class DocVersion implements Serializable {
...
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "doc_uuid")
@IndexedEmbedded
private Document2 document2;
...
}
文档 2:
@Entity
@Indexed
public class Document2 implements Serializable {
...
@Column(name = "entityState")
@Enumerated(EnumType.STRING)
@Field(bridge=@FieldBridge(impl=EnumBridge.class), index=Index.YES)
private EDocState eDocState;
...
}
这是我查询索引的方式(仅用于测试目的):
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
try {
fullTextEntityManager.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder()
.forEntity(DocVersion.class)
.get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword()
.onField("document2.eDocState").matching("HARD_DEL")
.createQuery();
List results = fullTextEntityManager.createFullTextQuery(luceneQuery, DocVersion.class)
.getResultList();
但我得到的不是结果:
WARNING: org.hibernate.search.bridge.BridgeException: Exception while calling bridge#objectToString
entity class: com.nws.vedica.model.entity.DocVersion
entity property path: document2.eDocState
field bridge: TwoWayString2FieldBridgeAdaptor [stringBridge=org.hibernate.search.bridge.builtin.EnumBridge@60942b8b]
那是什么意思呢?我是否需要为 Enumeration 实现一些特定的桥(它看起来像什么)? 这只是值枚举,所以我认为问题出在其他地方。
请协助我获取结果。
我正在使用的包: 休眠搜索 orm:5.9.3.
您不需要实现特定的桥,实际上恰恰相反:桥已经存在,因此 Hibernate Search 希望您将枚举值传递给查询,而您传递的是字符串值。
尝试将 .matching("HARD_DEL")
替换为 .matching(EDocState.HARD_DEL)
。
注意:我怀疑堆栈跟踪的其余部分会告诉您一些有关 class 转换异常的信息,这可能会提示您。为了您自己的利益,您可能不应该那样隐藏堆栈跟踪,堆栈跟踪可能包含有价值的信息。