使用ORDER BY查询端点中的值

问题描述 投票:0回答:1

我已经从本网站上的帖子中收到有关我的问题的建议,但是我不认为自己会朝正确的方向前进。我正在努力解决的问题是提供一种使用jpql的排序方法,可以使用此表进行演示:

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

我希望这样,当我输入列名时,我将能够按列对所有行的结果进行排序。因此,例如,如果我要按名称订购,那么它应该返回A B C而不是A C B。

我正在尝试的目标是,当我为我的API传递参数时:

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

现在,我知道可以使用以下方法解决此问题:

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

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

@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创建自定义排序参数,该参数应在调用端点时应用于结果。

java sql spring-boot jpql
1个回答
0
投票

对于动态查询,建议使用标准API,以实现您的目标,您可以这样做。

首先将实现添加到您的PersonRepository和自动装配的实体管理器中,以实现类似的功能

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();
    } 
}

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

© www.soinside.com 2019 - 2024. All rights reserved.