在休眠搜索中对嵌入式实体名称进行排序

Sorting on embedded entity name in 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();