我有以下查询:
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的参数不是以下之一:
如果它不适用于您使用的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实体的实例和要丢弃的第二个元素.
以下结果按"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)
这就像告诉查询将所有字符转换为大写之前的排序