我已经从本网站上的帖子中收到有关我的问题的建议,但是我不认为自己会朝正确的方向前进。我正在努力解决的问题是提供一种使用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创建自定义排序参数,该参数应在调用端点时应用于结果。
对于动态查询,建议使用标准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();
}
}
然后,通过服务或控制器,您可以自动连接此存储库,您将获得所需的行为。