我有以下hibernate搜索映射:
public class Courrier {
@IndexedEmbedded(depth = 2)
@OneToMany(mappedBy = "courrier", cascade = CascadeType.ALL)
@OrderBy("id")
private List<CourrierClassification> classifications;
索引是正常的,但列表的每个条目的字段名称都相同:
classifications.id
classifications.id
...
有没有办法将元素索引附加到字段名称,以便我可以区分条目(顺序很重要)
classifications1.id
classifications2.id
....
答案 0 :(得分:3)
不,你不能。您无法保持列表元素的顺序。此外,如果字段名称会根据您的建议而有所不同,您如何知道在查询中要定位哪些字段?
您可以编写自定义桥,在这种情况下,您可以添加任意字段名称。我只是提到这个是完整的。我不建议将列表顺序编码到字段名称中。也许您可以解释一下您的用例以及您想要查询的内容和方式?可能还有其他方法可以实现您的目标。
最后但并非最不重要的是,除非您的课程中存在循环引用,又称CourrierClassification
引用Courrier
,否则不需要depth
属性。
答案 1 :(得分:0)
我使用FieldBridge将具有自定义名称的字段添加到文档中。它有效。
@Field
@FieldBridge(impl = ClassificationFieldBridge.class)
@OneToMany(mappedBy = "courrier", cascade = CascadeType.ALL)
@OrderBy("id")
private List<CourrierClassification> classifications;
田野桥Impl:
public class ClassificationFieldBridge implements FieldBridge {
@Override
public void set(String name, Object value, Document luceneDocument, LuceneOptions luceneOptions) {
......
List<CourrierClassification> listClassifications = (List<CourrierClassification>) value;
int i = 1;
for (CourrierClassification courrierClassification : listClassifications) {
ValeurGenerique valeurGenerique = courrierClassification.getValeur();
Field field = new Field(name + i + ".valeur.rechercheLuceneNonTokenise", valeurGenerique.getRechercheLucene(), Field.Store.NO, Field.Index.NOT_ANALYZED);
luceneDocument.add(field);