首页 > 解决方案 > 在休眠搜索中对嵌入的实体名称进行排序

问题描述

我有以下实体定义。

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 中已经定义的排序注释的情况下实现这一点?

标签: hibernate-search

解决方案


改变这个:

    @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();

推荐阅读