按多列排序,包括按字段集合大小排序 spring jpa 存储库

Vik*_*rma 5 java spring hibernate querydsl spring-data-jpa

我不认为它是Order by count 的副本,使用 Spring Data JpaRepository

让我解释一下我的问题:-

我有一个名为 Account 的域对象,它由名称、状态、组对象列表、成员对象列表组成。

例如:-

@Entity
public class Account {
    private String name;
    private String status;

    @OneToMany( cascade = CascadeType.ALL, mappedBy = "account",orphanRemoval = true)
    private List<Group> groups;

    @OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Membership> memberships;


    // getters and setters..

}


@Eintity
public class Group{
    // fields and getters setters..
}


@Eintity
public class Membership{
    // fields and getters setters..
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 spring 数据 JPA 存储库来查找所有帐户并传递可分页和 querydsl 谓词参数(例如Page<Account> allAccountsPage = accountRepository.findAll(querydslPredicate, pageable);)。如果我只想按名称和/或状态对帐户进行排序,那么使用 pageable 效果很好,但是如果我想按组大小和/或成员大小排序 JPA 存储库对我不起作用。

我找到了一种可能的解决方案(即使用 Spring Data JpaRepository 按计数排序)但这仅适用于单列排序,但我需要实现多列排序,可能包括名称、状态、组(按大小)、成员资格(按大小) ) 以及任何顺序。

有没有可能和优雅的方式来做到这一点?

编辑:-

找到了一种使用 hibernate 的 @Formula 注释的方法。

这是一种方法:-

@Entity
    public class Account {
        private String name;
        private String status;

        @OneToMany( cascade = CascadeType.ALL, mappedBy = "account",orphanRemoval = true)
        private List<Group> groups;

        @OneToMany(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
        private List<Membership> memberships;


    @Formula("(select count(*) from groups where groups.account_id=id)")
    private long groupSize;


    @Formula("(select count(*) from membership where membership.account_id=id)")
    private long membershipSize;

        // getters and setters..

    }
Run Code Online (Sandbox Code Playgroud)

现在只需使用休眠条件来查找所有帐户,而不是按组和/或成员资格排序,现在您可以按组大小和成员资格大小对其进行排序。

但这不是一个好方法,因为@formula 创建了一个子查询,使您的查询变慢。此外,对于 Account hibernate 命中子查询上的每个 * select 查询来获取 groupSize 和 MembershipSize,这使得每个查询都非常慢。

所以上述解决方案不是解决我的问题的优雅方式。有人可以提出比这更好的解决方案吗?