我有以下查询:
select p from Plan as p where p.location = :location order by p.name
问题是,如果有三个计划如下: 苹果 蝙蝠 原子 脂
返回以下内容: 苹果 牛油 原子 蝙蝠
我需要以下内容: 苹果 原子 蝙蝠 脂
答案 0 :(得分:14)
例如,对于Hibernate,您可以在ORDER BY:
中使用LOWER函数到p.nameselect p from Plan as p where p.location = :location order by LOWER(p.name)
我认为上述内容不能保证适用于所有JPA实现,因为ORDER BY的参数不是以下之一:
如果它不适用于您使用的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)
通过使用OrderBy
或LOWER
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)