我们可以对 JPA 标准表达式进行左填充吗?



我有一个像colId这样的主键列,它的值像70 71等。

现在我想有一个JPA 标准表达式来像0070 0071等一样返回它。

我们如何在 JPA 标准表达式中做到这一点。

Expression<String> colId = root.get("colId").as(String.class);

现在有什么可以左边这个表达式的吗?

您可以使用条件生成器"函数"表达式,该表达式创建一个表达式来执行数据库函数。Postgres和MySQL有一个"LPAD"函数,可以在这种情况下使用。我仍在为此设置测试用例,但我有以下内容:

Expression<String>[] args = new Expression[3];
args[0] = root.get("id_column_name").as(String.class);
args[1] = criteriaBuilder.literal("5");
args[2] = criteriaBuilder.literal("0");
Expression<String> expressionToGetPaddedId = 
criteriaBuilder.function("LPAD", String.class, args);

供参考:

  • https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/criteria-api-calling-database-function.html

更新:

使用快速测试用例,我发现我的第二个参数键入不正确。这是我的规范中的"toPredicate"覆盖方法:

@Override
public Predicate toPredicate(@NonNull Root<T> root,
@NonNull CriteriaQuery<?> criteriaQuery,
@NonNull CriteriaBuilder criteriaBuilder) {

Expression<String> eTaskID = root.get("id").as(String.class);
Expression<Integer> length = criteriaBuilder.literal(4);
Expression<String> fillText = criteriaBuilder.literal("0");
Expression<String> expressionToGetPaddedId = criteriaBuilder.function(
"LPAD",
String.class,
eTaskID, length, fillText);
return criteriaBuilder.like(expressionToGetPaddedId, "0001");
}

生成的 SQL 为:

Hibernate: 
select
dataset0_.id as id1_2_,
dataset0_.created_at as created_2_2_,
dataset0_.is_deleted as is_delet3_2_,
dataset0_.model as model4_2_,
dataset0_.name as name5_2_,
dataset0_.organization as organiza6_2_,
dataset0_.properties as properti7_2_,
dataset0_.type as type8_2_,
dataset0_.updated_at as updated_9_2_ 
from
datasets dataset0_ 
where
LPAD(cast(dataset0_.id as varchar(255)), 4, ?) like ?

测试用例运行良好。看起来不错,对吧?

最新更新