Reputation: 924
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?
Upvotes: 7
Views: 7913
Reputation: 1145
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.
Upvotes: 0
Reputation: 48807
You could use the @javax.persistence.OrderBy
annotation:
@OneToMany(mappedBy="foo")
@OrderBy("date")
private Set<Bar> bars;
Upvotes: 7