jpa:执行不区分大小写的顺序

U-L*_*U-L 7 jpa

我有以下查询:

select p from Plan as p where p.location = :location order by p.name
Run Code Online (Sandbox Code Playgroud)

问题是,如果有三个计划如下:Apple bat atom Butter

返回以下内容:Apple Butter atom bat

我需要以下内容:Apple atom bat Butter

Mik*_*unu 14

例如,对于Hibernate,您可以在ORDER BY中使用LOWER函数到p.name:

select p from Plan as p where p.location = :location order by LOWER(p.name)
Run Code Online (Sandbox Code Playgroud)

我假设上面不保证可以与所有JPA实现一起使用,因为ORDER BY的参数不是以下之一:

  1. state_field_path_expression,其值为SELECT子句中指定的实体或可嵌入类抽象模式类型的可订购状态字段,具体如下:
    •general_identification_variable
    •single_valued_object_path_expression
  2. state_field_path_expression,其值为同一实体的相同状态字段或可嵌入的抽象模式类型,作为SELECT子句中的state_field_path_expression
  3. result_variable,它引用SELECT子句中的可订购项,并为其指定了相同的result_variable.这可能是SELECT子句中的aggregate_expression,scalar_expression或state_field_path_expression的结果.例如,以下四个查询是合法的.

如果它不适用于您使用的JPA实现,则必须使用以下查询:

select p, LOWER(p.name) AS name_order 
from Plan as p 
where p.location = :location order by name_order 
Run Code Online (Sandbox Code Playgroud)

缺点是查询的结果是对象数组的列表,每个列表中的第一个元素是Plan实体的实例和要丢弃的第二个元素.


Gri*_* P. 5

以下结果按"orderField"大小写排序不区分大小写

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = criteriaBuilder.createQuery(MyEntity.class);
Root<MyEntity> root = cq.from(MyEntity.class);
cq.select(root).where(...).orderBy(cb.desc(cb.upper(duplicate.get(MyEntity_.orderField))));
TypedQuery<MyEntity> query = entityManager.createQuery(cq);
query.getResultList();
Run Code Online (Sandbox Code Playgroud)

这就像告诉查询将所有字符转换为大写之前的排序