【发布时间】:2014-12-01 18:57:04
【问题描述】:
我有一个与实体 Header 具有一对多关系的实体消息。如何创建基于元组的搜索查询,例如
(message.headerKey="foo" and message.headerValue="123") and
(message.headerKey="bar" and message.headerValue="456")
当我在搜索条件中交换标题值时,我当前的逻辑也会匹配
(message.headerKey="foo" and message.headerValue="456") and
(message.headerKey="bar" and message.headerValue="123")
如何使用 Hibernate Search API 进行基于元组的查询?
这是我的消息实体:
@Entity
@Table(name="MESSAGE")
@Indexed
public class MessageEntity implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private Long id;
@Column(name="message_timestamp")
private Date timestamp;
@Column(name="payload")
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String payload;
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "message")
@IndexedEmbedded
private List<HeaderEntity> headers;
// Getters and Setters
}
这是我的标题实体:
@Entity
@Table(name="HEADER")
public class HeaderEntity implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="header_key")
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String headerKey;
@Column(name="header_value")
Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String headerValue;
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="message_id")
private MessageEntity message;
// Getters and Setters
}
这是我的搜索逻辑:
public List<MessageEntity> search(Header[] headers) {
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(mgr);
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(MessageEntity.class).get();
TermMatchingContext onFieldKey = qb.keyword().onField("headers.headerKey");
TermMatchingContext onFieldValue = qb.keyword().onField("headers.headerValue");
BooleanJunction<BooleanJunction> bool = qb.bool();
org.apache.lucene.search.Query query = null;
for (Header header : headers) {
bool.must(onFieldKey.matching(header.getKey()).createQuery());
bool.must(onFieldValue.matching(header.getValue()).createQuery());
}
query = bool.createQuery();
FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, MessageEntity.class);
persistenceQuery.setMaxResults(10);
return persistenceQuery.getResultList();
}
【问题讨论】:
标签: hibernate-search