spring-data-jpa 在Spring Data JPA中编写具有许多条件的HQL查询,有没有更好的方法?

moiiocjp  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(125)

下面我给出了一个假设场景,其中用户的年龄被转换为用户资源中的单词,并且我想要基于这个新字符串对用户数据进行排序,即8在这个顺序中具有最高优先级。

@Repository
public interface UserRepository extends JpaRepository<User, Long>, QueryByExampleExecutor<User> {

    @Query(value = "SELECT DISTINCT(u) FROM user u ORDER BY " +
            "CASE WHEN u.age = 8 THEN 1 WHEN u.age = 18 THEN 2 WHEN u.age = 80 THEN 3 " +
            "WHEN u.age = 88 THEN 4 WHEN u.age = 85 THEN 5 WHEN u.age = 84 THEN 6 WHEN u.age = 89 THEN 7 WHEN u.age = 81 THEN 8 " +
            "WHEN u.age = 87 THEN 9 WHEN u.age = 86 THEN 10 WHEN u.age = 83 THEN 11 WHEN u.age = 82 THEN 12 WHEN u.age = 11 THEN " +
            "13 WHEN u.age = 15 THEN 14 WHEN u.age = 50 THEN 15 WHEN u.age = 58 THEN 16 WHEN u.age = 55 THEN 17 WHEN u.age = 54 " +
            "THEN 18 WHEN u.age = 59 THEN 19 WHEN u.age = 51 THEN 20 WHEN u.age = 57 THEN 21 WHEN u.age = 56 THEN 22 WHEN u.age = " +
            "53 THEN 23 WHEN u.age = 52 THEN 24 WHEN u.age = 5 THEN 25 WHEN u.age = 40 THEN 26 WHEN u.age = 48 THEN 27 WHEN u.age " +
            "= 45 THEN 28 WHEN u.age = 44 THEN 29 WHEN u.age = 49 THEN 30 WHEN u.age = 41 THEN 31 WHEN u.age = 47 THEN 32 WHEN u" +
            ".age = 46 THEN 33 WHEN u.age = 43 THEN 34 WHEN u.age = 42 THEN 35 WHEN u.age = 4 THEN 36 WHEN u.age = 14 THEN 37 WHEN u.age = 9 THEN 38 WHEN u.age = 19 THEN 39 WHEN u.age = 90 THEN 40 WHEN u.age = 98 THEN 41 WHEN u.age = 95 THEN 42 WHEN u.age = 94 THEN 43 WHEN u.age = 99 THEN 44 WHEN u.age = 91 THEN 45 WHEN u.age = 97 THEN 46 WHEN u.age = 96 THEN 47 WHEN u.age = 93 THEN 48 WHEN u.age = 92 THEN 49 WHEN u.age = 1 THEN 50 WHEN u.age = 100 THEN 51 WHEN u.age = 7 THEN 52 WHEN u.age = 17 THEN 53 WHEN u.age = 70 THEN 54 WHEN u.age = 78 THEN 55 WHEN u.age = 75 THEN 56 WHEN u.age = 74 THEN 57 WHEN u.age = 79 THEN 58 WHEN u.age = 71 THEN 59 WHEN u.age = 77 THEN 60 WHEN u.age = 76 THEN 61 WHEN u.age = 73 THEN 62 WHEN u.age = 72 THEN 63 WHEN u.age = 6 THEN 64 WHEN u.age = 16 THEN 65 WHEN u.age = 60 THEN 66 WHEN u.age = 68 THEN 67 WHEN u.age = 65 THEN 68 WHEN u.age = 64 THEN 69 WHEN u.age = 69 THEN 70 WHEN u.age = 61 THEN 71 WHEN u.age = 67 THEN 72 WHEN u.age = 66 THEN 73 WHEN u.age = 63 THEN 74 WHEN u.age = 62 THEN 75 WHEN u.age = 10 THEN 76 WHEN u.age = 13 THEN 77 WHEN u.age = 30 THEN 78 WHEN u.age = 38 THEN 79 WHEN u.age = 35 THEN 80 WHEN u.age = 34 THEN 81 WHEN u.age = 39 THEN 82 WHEN u.age = 31 THEN 83 WHEN u.age = 37 THEN 84 WHEN u.age = 36 THEN 85 WHEN u.age = 33 THEN 86 WHEN u.age = 32 THEN 87 WHEN u.age = 3 THEN 88 WHEN u.age = 12 THEN 89 WHEN u.age = 20 THEN 90 WHEN u.age = 28 THEN 91 WHEN u.age = 25 THEN 92 WHEN u.age = 24 THEN 93 WHEN u.age = 29 THEN 94 WHEN u.age = 21 THEN 95 WHEN u.age = 27 THEN 96 WHEN u.age = 26 THEN 97 WHEN u.age = 23 THEN 98 WHEN u.age = 22 THEN 99 WHEN u.age = 2 THEN 100 ELSE 0 END ASC")
    Page<User> findAllByCustomOrder(Pageable pageable);

我的User类是这样的-

@Entity(name = "user")
public class User {

    private @Id @GeneratedValue Long id;

    private final String firstName;
    private final String lastName;
    private final Integer age;

    // standard getters, setters and constructors

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
        User user = (User) o;
        return id != null && Objects.equals(id, user.id);
    }

    @Override
    public int hashCode() {
        return getClass().hashCode();
    }
}

我的UserResource类是这样的-

public class UserResource {

    private String firstName;
    private String lastName;
    private String age;

    // standard getters, setters and constructors

}

在我原来的情况下,我有超过2000个不同的条件,所以这种方法显然不是正确的方式去。
另一种解决方案是将一个自定义比较器传递给Spring Data JPA的方法,以便在对数据排序时使用该比较器。但是我找不到是否存在这样一种方便的机制。如果有任何帮助,我将不胜感激。

4xy9mtcn

4xy9mtcn1#

既然你似乎很关心基于数据库的分页,那么最好的办法就是使用某种基于SQL的排序。你可以将这个大case表达式移到一个数据库函数中,或者将Map放到某种表中,然后连接该表并使用该列进行排序。比较器不会起作用,因为排序对于分页的正常工作很重要。

相关问题