Criteriabuilder lower()vs Java toLowerCase()

时间:2016-01-27 06:33:06

标签: java hibernate jpa

根据此Link

  

Predicate lcSurnameLikeSearchPattern = criteriaBuilder.like(        criteriaBuilder。的(Person_.surname),        是searchPattern的 toLowerCase ());

这看起来像Hibernate会生成一个类似于

的SQL
LOWER(PERSON.SURNAME) LIKE 'searchPattern'

使用toLowerCase提供的任何实现,在Java中降低searchPattern的位置。而查询LOWER将使用Oracle实现。对于ASCII字符,我猜测事情很简单,但国际UTF字符会不会有差异?

如何让JPA降低查询中LIKE的两个操作数?所以生成的查询看起来像

LOWER(PERSON.SURNAME) LIKE LOWER('searchPattern')

1 个答案:

答案 0 :(得分:4)

您可以将两个表达式用作like方法参数,并使用literal将字符串包装到表达式中:

Predicate lcSurnameLikeSearchPattern = criteriaBuilder.like(
  criteriaBuilder.lower(Person_.surname),
  criteriaBuilder.lower(criteriaBuilder.literal(searchPattern))
);

CriteriaBuilder#like(Expression,Expression)

CriteriaBuilder#lower(Expression)

CriteriaBuilder#literal(T)

我省略Person_.surname定义,因为它来自您的示例。