gpt4 book ai didi

java - JPA Pageable 排序顺序区分大小写

转载 作者:行者123 更新时间:2023-12-05 08:07:48 26 4
gpt4 key购买 nike

我正在使用 JpaRepository Pageable 查询进行分页。除了排序字段区分大小写的问题外,所有的东西都工作正常。以下查询用于获取列表。

Pageable pageable = null;
if (paginationRequestDTO.getSortOrder().equalsIgnoreCase("desc"))
pageable = new PageRequest(page, size, Sort.Direction.DESC, sortfiled);
else
pageable = new PageRequest(page, size, Sort.Direction.ASC, sortfiled);

Page<Audi> audiPage = null;
audiencePage = audiRepository.search(paginationRequestDTO.getSearchKey(), pageable);

Audi 表值为:apple,az,Ajay,Bala。当我使用 asc 排序顺序搜索并排序字段名称时,原始输出:Ajay,Bala,apple,az。预期输出:Ajay,apple,az,Bala

我正在使用 mysql 数据库。表引擎 - Innodb,characterst-utf8,collat​​e-utf8_bin.

请注意,它不是重复的问题。我没有得到这个问题的确切答案。提前致谢。

最佳答案

编辑:作为harsh正确指出,这需要使用正确的排序规则在数据库级别解决。这很重要,因为您可能希望在排序列上有一个索引以获得最佳性能。

但是还有其他用例,可以将过滤与排序结合起来,而不是纯列值,例如按描述的长度、列的总和或平均值等。因此,我包含一个 JPA 解决方案:

我最近为此苦苦挣扎,恐怕 Pageable 接口(interface)不支持开箱即用。

解决方案是使用 EntityManagerCriteriaBuilderCriteriaQuerySpecification 并手动实现分页。您可以找到解决方案here .

您需要手动构建Page 对象:

public Page<Audi> getPage(int pageNumber, int pageSize, String descriptionFilter, Sorting sorting) {
return new PageImpl<>(
getPageItems(pageNumber, pageSize, descriptionFilter, sorting),
PageRequest.of(pageNumber, pageSize, Sort.by(Sort.Direction.ASC, sorting.name())),
getTotalCount(descriptionFilter)
);
}

getPageItems 使用 LIMITOFFSET

选择页面
private List<Audi> getPageItems(int pageNumber, int pageSize, String descriptionFilter, Sorting sorting) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Audi> query = cb.createQuery(Audi.class);
Root<Audi> root = query.from(Audi.class);
query.where(createSpecification(descriptionFilter).toPredicate(root, query, cb));

if (sorting.equals(Sorting.descriptionCaseInsensitive)) {
query.orderBy(cb.asc(cb.lower(root.get("description"))));
} else {
throw new UnsupportedOperationException("Unsupported sorting: " + sorting.name());
}
query.select(root);

return em.createQuery(query)
.setFirstResult(pageNumber * pageSize)
.setMaxResults(pageSize)
.getResultList();
}

getTotalCount 选择count(distinct(*)),

private long getTotalCount(String descriptionFilter) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<Audi> root = query.from(Audi.class);
query.where(createSpecification(descriptionFilter).toPredicate(root, query, cb));
query.select(cb.countDistinct(root));

// getSingleResult can return null, if no rows fulfill the predicate
return Optional.ofNullable(em.createQuery(query).getSingleResult()).orElse(0L);
}

两者都重用相同的谓词,过滤行:

private Specification<Audi> createSpecification(String descriptionFilter) {
return Specification.where(
(root, query, criteriaBuilder) ->
criteriaBuilder.like(criteriaBuilder.lower(root.get("description")), "%" + descriptionFilter.toLowerCase() + "%")
);
}

关于java - JPA Pageable 排序顺序区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com