Spring JPA criteria builder greaterThan : 我可以传递字符串值来比较数据库中的数字类型吗

Spring JPA criteria builder greaterThan : Can I pass String value for comparing Number type in database

我正在使用 Spring Data JPA 标准生成器 greaterThan API 进行比较。

数据库字段 rating 的类型为 NUMBER(5,0)。实体 class 有一个类型为 Integer 的字段 rating。我正在传递类型 String 的值进行比较。

即使我没有传递 Integer 值进行比较,它仍然返回有效结果。请帮我理解这是怎么可能的。

意思是,当数据库中字段的实际数据类型为不同类型时,我可以将数据库字段的java String版本传递给greaterThan方法。

我的比较代码块如下所示

CriteriaBuilder cb = entityManager.getCriteriaBuilder();

CriteriaQuery cq = cb.createQuery();

Root<Customer> root = cq.from(Customer.class);
//you can see here , value 20 I am passing as String
Predicate comparisonPredicate = cb.greaterThan(root.get("rating"), "20");

cq.where(comparisonPredicate );

cq.select(root);

TypedQuery<Customer> query = entityManager.createQuery(cq);

这种行为是not documented
查看 the openJPA source code for Expressions.GreaterThan,更具体地说是 toKernelExpression,

@Override
org.apache.openjpa.kernel.exps.Expression toKernelExpression(ExpressionFactory factory, CriteriaQueryImpl<?> q){
  Value val1 = Expressions.toValue(e1, factory, q);
  Value val2 = Expressions.toValue(e2, factory, q);
  Expressions.setImplicitTypes(val1, val2, e1.getJavaType(), q);
  return factory.greaterThan(val1, val2);
}

JPA 使用第一个表达式的类型来构建查询。 此行为看起来更像是一个 意外特征 而不是有意实施。您应该 而不是 依赖于此并且应该显式转换变量。您还可以使用 MetaModel 在尝试将苹果与橙子进行比较时出现编译器错误。