有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用ORDER BY对端点中的值进行排序的java查询

关于我的问题,我已经听取了本网站帖子的建议,但我认为我的方向不对。我正在努力解决的问题是使用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创建一个自定义排序参数,当调用端点时,该参数应该应用于结果


共 (1) 个答案

  1. # 1 楼答案

    对于动态查询,建议使用criteria API,以便实现您的目标

    首先在PersonRepository和autowired Entity Manager中添加一个实现,以实现类似的功能

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

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