2017-11-17 15 views
0

注文した日付で顧客のアイテムのリストをソートしようとしています。 DateはItemを通じてのみ使用可能です。 orderPositions.order.orderDate。しかし@IndexedEmbeddedは機能しません。 ExeptionまたはErrorはありませんが、結果はHSロジックのみでソートされます。@OneToMany関連で検索の並べ替えを休止できませんか?

@Entity 
    @Indexed 
    public class Item{ 
     @Id 
     private long id; 

     @Field(index = Index.YES, store = Store.YES, analyse = Analyse.YES, analyser = @Analyzer(definition = Constant.ANALYSER)) 
     private String description; 

     @OneToMany(mappedBy = "item") 
     @IndexedEmbedded 
     private List<OrderPosition> orderPositions; 

     @ManyToOne 
     @IndexedEmbedded 
     private Company company;   
    //getter&setter 
    } 

    @Entity 
    public class OrderPosition{ 
     @Id 
     private long id; 

     @ManyToOne 
     private Item item; 

     @ManyToOne 
     @IndexedEmbedded 
     private Order order; 
    //getter&setter 
    } 

    @Entity 
    public class Order{ 
     @Id 
     private long id; 

     @ManyToOne 
     private Customer customer; 

     @Field(index = Index.NO, store = Store.NO, analyze = Analyze.NO) 
     @SortableField 
     private String orderDate; 
    //getter&setter 
    } 

    @Entity 
    public class Company{ 
     @Id 
     private long id; 

     @Field(index = Index.NO, store = Store.NO, analyze = Analyze.NO) 
     @SortableField 
     private String name; 
    //getter&setter 
    } 

アイテムごとに並べ替えを行う場合。 company.nameうまく動作します。

queryService.buildFullTextQuery("searchText", Item.class, "description", "company.name").getResultList(); 

アイテムを並べ替える場合。 orderPosition.order.orderDate、私がFullTextQueryをこのように構築し、デフォルト(HS-ロジック)

queryService.buildFullTextQuery("searchText", Item.class, "description", "orderPositions.order.orderDate").getResultList(); 

によって並べ替えられています:

public FullTextQuery buildFullTextQuery(@NonNull String searchText, @NonNull Class<?> clazz, @NonNull String... fields) throws Exception { 
     FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager()); 
     QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(clazz).get(); 
     Query query = qb.keyword().onField(fields[0]).matching(searchText).createQuery(); 
     SortField sortField = new SortField(fields[1], SortField.Type.STRING, false); 
     Sort sort = new Sort(sortField); 
     return fullTextEntityManager.createFullTextQuery(query, clazz).setSort(sort); 
    } 

私はHSが@OneToManyの関連付けを見つけることができませんと思います。この問題を解決する方法はありますか?

は、私は正確にあなたのクエリの結果なしで何が起こっているかを伝えることはできません

答えて

0

事前にありがとうございます、しかし、あなたは間違いなく、ここで間違って何かをやっている:あなたは複数値フィールドでソートしようとしています。 1つのアイテムは複数のオーダーにリンクされ、それぞれに独自の日付が割り当てられます。したがって、1項目につき複数の日付があります。

3つの日付を持つ2つのアイテムを比較するように質問するとき、Hibernate Searchは何をすべきですか?最新の日付だけを比較しますか?最も早い日付のみを比較しますか?あなたは言わなかったので、あなたの質問は矛盾した結果を返すようになっています。

多値フィールドで選択する値をHibernate Searchに伝える方法がないので、最も簡単な方法は、ソートする単一値フィールドを明示的に作成することです。例えば

、最新の順序を返すためにItemにゲッターを追加し、そこに@IndexedEmbeddedを追加することができます。

@Entity 
@Indexed 
public class Item{ 
    @Id 
    private long id; 

    @Field(index = Index.YES, store = Store.YES, analyse = Analyse.YES, analyser = @Analyzer(definition = Constant.ANALYSER)) 
    private String description; 

    @OneToMany(mappedBy = "item") 
    @IndexedEmbedded 
    private List<OrderPosition> orderPositions; 

    @ManyToOne 
    @IndexedEmbedded 
    private Company company;   

    @javax.persistence.Transient 
    public Order getLatestOrder() { 
     Order latestOrder; 
     // ... compute the latest order ... 
     return latestOrder; 
    } 

    //getter&setter 
} 

次にソートにlatestOrder.orderDateを、あなたは良いことがあります。

関連する問題