使用order by对端点中的值进行排序的查询

a0zr77ik  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(416)

我已经采纳了这个网站上关于我的问题的帖子的建议,但是我不相信我的方向是正确的。我正在努力解决的问题是提供一个使用jpql的排序方法,可以使用下表来演示:

Name | Address | City |
--------------------------
   A  |    A    |   C  | 
   C  |    B    |   B  |
   B  |    C    |   A  |

我希望这样,当我传入一列的名称时,我将能够按列排序所有行的结果。例如,如果我要按名称排序,那么它应该返回bc而不是cb。
我尝试的目标是,当我为api传入一个参数时:

http://localhost:8080/api/person?sorting=city

现在我明白了这可以通过以下方法解决:

http://localhost:8080/api/person?sort=city,asc

但是,我不能在这种情况下使用sort参数,因为我依赖于来自多个域的信息。因此,我决定看看是否有可能在我的存储库中创建一个查询,用于对值进行排序。这是我迄今为止的尝试:

@Query("SELECT p FROM DePerson p, DeClass c, DeSchool s" +
        "WHERE p.personId = c.id " +
        "AND su.schoolId = s.id " +
        "ORDER BY :ordering")
List<DePerson> sortingAll(String sorting);

因此,我尝试查看是否能够从存储库传入此查询,并在服务方法中使用它作为传递端点时对结果的排序方法:

List<PersonDTO> result = new ArrayList<>();
        Page<DePerson> page;

    List<DePerson> personList = page.getContent();
        for (DePerson person: personList) {
            result.add(convertDTO(person));
        }        

    return new PageImpl<>(result, pageable, page.getTotalElements());

最后,我尝试使用jpql创建一个自定义排序参数,当调用端点时,该参数应该应用于结果。

w8biq8rn

w8biq8rn1#

对于动态查询,建议使用criteriaapi,以便实现您的目标。
首先,向personrepository和AutowiredEntityManager添加一个实现,使其具有类似的功能

PersonRepositoryImpl implements PersonRepository{
    @Autowired
    EntityManager em;
    //here you can also pass Page object and modify some staff
    private List<Person> getEntitiesOrder(String sortColumn){
          CriteriaBuilder cb = entityManager.getCriteriaBuilder();
          CriteriaQuery<Person> query = cb.createQuery(Person.class);
          Root<Person> people= query.from(Person.class);
          query.select(people).orderBy(cb.desc(people.get(sortColumn)));
          TypedQuery<Person> queryPeople = 
                 entityManager.createQuery(query);
         return queryPeople.getResultList();
    } 
}

然后形成您的服务或控制器,您可以自动连接此存储库,您将获得所需的行为。

相关问题