在休眠搜索中对嵌入式实体名称进行排序
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();
我有以下实体定义。
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();