7

I'm using JpaRepository and JpaSpecificationExecutor from Spring Data and i'm having a problem to sort the method findAll(specification, pageable, sort)

I want to sort the result of a specification by a nested property from the main repo class. This is my case:

the main class

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

the ordering class

class Bar { @ManyToOne @JoinColumn(name="fooId") private Foo foo; //I WANT TO SORT BY THIS FIELD @Column private Date date; } 

and this is my repo

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

this is how i'm trying order this result

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

and when i run this i'm getting the "PropertyReferenceException: No property date found for type Foo!"

How can i do this?

2 Answers 2

7

You could use the @javax.persistence.OrderBy annotation:

@OneToMany(mappedBy="foo") @OrderBy("date") private Set<Bar> bars; 
Sign up to request clarification or add additional context in comments.

2 Comments

it's a good approach but i want to sorting by this field in just one time. If i use this i'm sorting by bars.date in all of repository.findAll calls
@pablobaldez Then you're right, this solution won't suit your needs.
0

The date field is defined on Bar, not Foo. So define a BarRepo and call findAll() on the BarRepo using the date sort. Since you have a bi-directional association, you can get Foo from each Bar returned by findAll() and filter out any duplicate Foo.

Or you can try using @Query annotation on a FooRepo interface method to define native sql to execute.

7 Comments

I have many specifications works to Foo, so the FooRepo is excencial.
i want to do some like this: "new Sort (Order("bars.date")) //this working as well" - but using metamodel classes. You know how can i navigate between metamodel properties?
If you want to sort a list of Foo, you need to pick one Bar for each Foo to sort by, right?
Yes. I had thought the join colunm resolve this for me, and the repo would do this automaticaly
"select * from foo inner join bar on foo.id = bar.fooId order by bar.date" - this will works, right? How can i do this with criteria,jpa repo (for foo) and specifications (that returns predicates)
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.