【问题标题】:Query using ORDER BY for sorting values in endpoint使用 ORDER BY 进行查询以对端点中的值进行排序
【发布时间】:2020-10-01 01:08:33
【问题描述】:

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

【问题讨论】:

  • 那么当你运行它时会发生什么?会报错吗?
  • 你好@ShubhamSrivastava 它没有,因为不太确定它会如何链接。
  • 这不是一个好主意,直​​接将排序传递给sql。您可能会遇到 SQL 注入等安全问题。

标签: java sql spring-boot jpql


【解决方案1】:

对于动态查询,建议使用条件 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();
    } 
}

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

【讨论】:

  • 也检查这个链接thorben-janssen.com/…
  • 你好,我可以把这个方法和我的东西联系起来吗?
  • 嗨,我编辑了我的答案,检查一下,如果有什么不清楚的地方告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多