gpt4 book ai didi

java - Spring数据JPA中的排序表达式

转载 作者:行者123 更新时间:2023-12-04 01:13:59 25 4
gpt4 key购买 nike

我有以下实体类,其中 objectId 是字母数字字符串

@Data
@Entity
@Table(name = "CASE_INFO")
public class CaseInfo {
@Id
@Column(name = "ID")
private UUID id;

@Column(name = "OBJECT_ID")
private String objectId;
}
我还有以下存储库
@Repository
public interface CaseInfoRepository extends JpaRepository<CaseInfo, UUID>, JpaSpecificationExecutor<CaseInfo> { }
现在,当我根据这样的 Specification 和 Pageable 对象进行查询时
Specification<CaseInfo> specification = (Specification<CaseInfo>) (root, query, criteriaBuilder) -> criteriaBuilder.and();
Pageable pageable = PageRequest.of(0, 25, Sort.by("objectId"));
caseInfoRepository.findAll(specification, pageable);
我希望能够以数字方式基于 CaseInfo.objectId 对结果进行排序,以便 sql 查询中的 order 看起来像这样
... order by to_number(OBJECT_ID) ...
如果我做类似的事情
PageRequest.of(0, 25, Sort.by("objectId"))
它按字母顺序排列,因此“100”在“2”之前,这对我的用例来说是错误的。
我找到了 https://www.baeldung.com/spring-data-jpa-query它使用的地方
JpaSort.unsafe("LENGTH(name)")
但这似乎不起作用,因为如果我这样做
PageRequest.of(0, 25, JpaSort.unsafe("to_number(objectId)"))
它给出错误消息“找不到类型 CaseInfo 的属性!您是说 'id' 吗?”
有人知道给 Sort 对象提供自定义表达式的方法吗?

最佳答案

您可以添加一个公式字段,将字符串值转换为数字,然后按此字段排序或使用默认实现 findAll(Pageable pageable) :

@Data
@Entity
@Table(name = "CASE_INFO")
public class CaseInfo {
@Id
@Column(name = "ID")
private UUID id;

@Column(name = "OBJECT_ID")
private String objectId;

@Formula(value = "CAST(OBJECT_ID AS NUMERIC(10, 0))")
private int numObjectId;
}
存储库:
@Repository
public interface CaseInfoRepository extends
JpaRepository<CaseInfo, UUID>, JpaSpecificationExecutor<CaseInfo> {

// sort by formula field
List<CaseInfo> findAllByOrderByNumObjectId(Pageable pageable);
}
有一个 trick with using CAST function in @Formula -- 转换到 INT时极有可能失败, INTEGER , BIGINT但它在转换到 NUMERIC(10, 0) 时有效. Numeric也应该足够大以在转换后包含字符串中的值,否则可能会发生整数溢出。

关于java - Spring数据JPA中的排序表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63939687/

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