Spring Data: 按嵌套属性排序

7

我正在使用Spring Data中的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: No property date found for type Foo!"的错误信息,应该怎么办?
2个回答

7

2
这是一个不错的方法,但我只想在一次排序中按此字段排序。如果我使用它,那么在所有repository.findAll调用中,我都会按bars.date排序。 - pablobaldez
@pablobaldez 那么你是对的,这个解决方案不适合你的需求。 - sp00m

0

Bar上定义了date字段,而不是Foo。因此,请定义一个BarRepo并使用日期排序调用BarRepo上的findAll()方法。由于你有双向关联,可以从findAll()返回的每个Bar中获取Foo,并过滤掉任何重复的Foo

或者你可以尝试在FooRepo接口的方法上使用@Query注解来定义要执行的本地SQL


我有很多关于Foo的规格说明工作,因此FooRepo是必不可少的。 - pablobaldez
如果你想对一个 Foo 列表进行排序,你需要为每个 Foo 选择一个 Bar 来进行排序,对吧? - Shane Voisard
JPARepository无法推断出从列表中选择哪个“Bar”来对“Foo”进行排序。如果“Foo”具有空的“Bar”列表,JPARepository应该怎么做? - Shane Voisard
我理解你的意思,对jparepository并不了解,但是用SQL可以实现。 - pablobaldez
2
"select * from foo inner join bar on foo.id = bar.fooId order by bar.date" - 这个可以工作,对吧?我如何使用criteria、jpa repo(针对foo)和返回谓词的specifications来实现这个? - pablobaldez
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接