Сортировка по имени встроенной сущности в спящем поиске - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть следующие определения сущностей.

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, которое называется accountName, а затем просто добавим сортировочную аннотацию поверх этого. Можно ли этого добиться, не указав в порядке заказа аннотацию сортировки, а просто используя аннотацию сортировки, которая уже определена в учетной записи?

1 Ответ

1 голос
/ 26 февраля 2020

Измените это:

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