hibernate-search - 在休眠搜索中对嵌入的实体名称进行排序
问题描述
我有以下实体定义。
public class Order {
@Id
@DocumentId
private Long id;
@Field
@IndexedEmbedded(includePaths = {"name"})
@OneToOne
@JoinColumn(name = "ACCOUNT_ID")
private Account account;
// the rest are omitted for brevity purpose
}
public class Account {
@Id
@DocumentId
private Long id;
@SortableField(forField = "name_Sort")
@Field(name = "name_Sort", store = Store.YES, normalizer= @Normalizer(definition = SearchConstants.LOWER_CASE_NORMALIZER))
@Column(name = "NAME")
private String name;
}
如果我在 Order 上搜索并希望按帐户名称对搜索结果进行排序,是否有可能使用嵌入式索引注释的好方法?我知道我们可以通过在 Order 中添加一个名为 accountName 的额外字符串字段来做到这一点,然后只需在其上添加排序注释即可。是否可以在不指定 Order 中的排序注释而只使用 Account 中已经定义的排序注释的情况下实现这一点?
解决方案
改变这个:
@IndexedEmbedded(includePaths = {"name"})
对此:
@IndexedEmbedded(includePaths = {"name", "name_Sort"})
然后您可以使用该字段account.name_Sort
对订单进行排序:
QueryBuilder builder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity( Order.class ).get();
Query luceneQuery = /* ... */;
FullTextQuery query = s.createFullTextQuery( luceneQuery, Order.class );
query.setSort(
builder.sort().byField("account.name_Sort").createSort()
);
List results = query.list();
推荐阅读
- amazon-s3 - AWS S3 中的跨账户文件访问
- python - 您将如何使用另一个包含列表的列表来订购包含列表的列表?
- vhdl - VHDL 中的 2:1 Mux - 信号不改变值
- apache-spark - 带有结构化流 protobuf 的 Apache Kafka
- java - 实现 Iterable 与实现 Iterator
- c - 将文件的每一行作为字符串存储在数组中
- sql-server-2012 - SQL“组”和“计数”类别
- encoding - 在 Jest 测试中编码的双引号
- python - 使用“scrapy”进行 Python 网络抓取:不从 span 中提取文本
- javascript - 在 GraphQL 的根部解析自定义类型