2015-04-17 99 views
4

我使用JpaRepositoryJpaSpecificationExecutor從春季數據,我有一個問題排序的方法findAll(specification, pageable, sort)春數據:訂購嵌套屬性

我想從一個嵌套的屬性規範的結果進行排序主要的回購類。這是我的情況:

主類

class Foo { 
    //other properties 
    @OneToMany(mappedBy="foo") 
    private Set<Bar> bars; 
} 

排序類

class Bar { 
    @ManyToOne 
    @JoinColumn(name="fooId") 
    private Foo foo; 

    //I WANT TO SORT BY THIS FIELD 
    @Column 
    private Date date; 
} 

,這是我的回購

interface FooRepo extends JpaRepository<Foo , Long>, 
     JpaSpecificationExecutor<Foo>{ 
    //just jparepo methods 
} 

這是如何我想這個順序結果

void anymethod(){ 
    Sort sort = new Sort(Bar_.date.getName()); 
    PageRequest pr = new PageRequest(anyPage, anyMaxResultsNum, sort); 
    repository.findAll(anySpecification, pr); 

} 

當我運行這個我得到的「PropertyReferenceException:找不到類型Foo的屬性日期!」

我該怎麼做?

回答

0

date字段在Bar而不是Foo上定義。因此,使用日期排序在BarRepo上定義BarRepo並呼叫findAll()。由於您有雙向關聯,因此您可以從findAll()返回的每個Bar獲得Foo,並篩選出任何重複的Foo

或者您可以嘗試使用上FooRepo接口方法@Query註釋來定義native sql to execute

+0

我有很多規範工作,以富,所以FooRepo是excencial。 – pablobaldez

+0

我想要做一些這樣的事情:「new Sort(Order(」bars.date「))// This this as well as」 - 但使用元模型類。您知道我如何在元模型屬性之間導航? – pablobaldez

+0

如果您想對「Foo」列表進行排序,您需要爲每個「Foo」選擇一個「Bar」進行排序,對吧? –

5

您可以使用@javax.persistence.OrderBy註釋:

@OneToMany(mappedBy="foo") 
@OrderBy("date") 
private Set<Bar> bars; 
+1

這是一個很好的方法,但我想在這個領域進行一次排序。如果我使用這個,我通過bars.date在所有repository.findAll中調用 – pablobaldez

+0

@pablobaldez然後你是對的,這個解決方案將不適合你的需求。 – sp00m