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

时间:2012-03-29 22:29:44

标签: jpa

我有以下查询:

select p from Plan as p where p.location = :location order by p.name

问题是,如果有三个计划如下: 苹果 蝙蝠 原子 脂

返回以下内容: 苹果 牛油 原子 蝙蝠

我需要以下内容: 苹果 原子 蝙蝠 脂

3 个答案:

答案 0 :(得分:14)

例如,对于Hibernate,您可以在ORDER BY:

中使用LOWER函数到p.name
select p from Plan as p where p.location = :location order by LOWER(p.name)

我认为上述内容不能保证适用于所有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。这可能是aggregate_expression的结果,a scalar_expression,或SELECT子句中的state_field_path_expression。 例如,以下四个查询是合法的。
  4. 如果它不适用于您使用的JPA实现,则必须使用以下查询:

    select p, LOWER(p.name) AS name_order 
    from Plan as p 
    where p.location = :location order by name_order 
    

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

答案 1 :(得分: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();

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

答案 2 :(得分:0)

通过使用OrderByLOWER

包装排序列,可以使用UPPER注释实现不区分大小写的排序
@OrderBy("UPPER(firstName) ASC")
private List<User> members = new ArrayList<User>(); 

下面是hibernate生成的SQL

SELECT user0_.id AS id1_0_0_,
       user0_.firstname AS firstname2_0_1_,
       user0_.lastname AS lastname3_0_1_
FROM user user0_
WHERE user0_.user_id=?
ORDER BY upper(user0_.firstname)