【问题标题】:Hibernate @OrderBy("firstName ASC") case insensitive?Hibernate @OrderBy("firstName ASC") 不区分大小写?
【发布时间】:2016-07-15 17:01:12
【问题描述】:

我们使用休眠并有一个包含成员列表的团队对象:

@OrderBy("firstName ASC")
private List<User> members = new ArrayList<User>();

但我们希望它不区分大小写且不区分大小写,例如,小写字母 a 将位于其他大写字母下方。 在第 2.2.5.3.4 章的hibernate documentation 中。我找到了如何使用 @OrderBy 注释进行排序,但没有提示如何不区分大小写。

亲切的问候

【问题讨论】:

    标签: java spring hibernate jpa annotations


    【解决方案1】:

    您可以通过使用LOWERUPPER 注释排序列来指定不区分大小写的排序

    @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)
    

    【讨论】:

    • 我试过了,但我得到了一个 persistenceException:异常描述:按值排序 [UPPER(firstName)],在实体 [class [...]Team] 的元素 [members] 上指定,是无效的。目标实体 [class [...]User] 上不存在具有该名称的属性或字段。似乎它搜索属性 U​​PPER(firstName)。知道如何解决这个问题吗?
    • 我确实从javax.persistence 导入了OrderBy,我尝试使用JPA 和休眠Criteria 成功了
    • 您能否发布您的代码,您使用的是 JPA 实体管理器还是 Hibernate 会话工厂?
    【解决方案2】:

    要按普通字段以外的东西排序,你必须把它也放在 select 子句中,所以

    SELECT e, UPPER(e.firstName) AS firstNameUpper FROM MyEntity e WHERE ... ORDER BY firstNameUpper ASC
    

    显然,您必须在结果处理中允许额外的结果项。见JPQL BNF

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2011-01-14
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2012-12-01
      • 2013-03-06
      相关资源
      最近更新 更多