【问题标题】:JPA Criteria query order by enum valuesJPA Criteria 按枚举值查询顺序
【发布时间】:2012-06-16 04:34:38
【问题描述】:

如何使用 JPA 标准对枚举进行排序。 例如获取类似的查询 "ORDER BY CASE 颜色 'YELLOW' THEN 1 WHEN 'RED' THEN 3 ELSE 2 END"

【问题讨论】:

  • 我认为 JPQL 不可能,但您可以使用 JPA NativeQuery。
  • 我猜既然 JPQL 支持 case-when in order-by 子句,JPA Criteria API 也应该支持它。

标签: jpa enums sql-order-by case criteria-api


【解决方案1】:

这是我阅读 JPA Docs 后的处理方式:http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Order 我没有深入了解它是如何在内部处理的,但我猜它是基于枚举序数排序的

 criteriaQuery.orderBy(criteriaBuilder.asc(Root.get("columnName")));

【讨论】:

    【解决方案2】:

    JPA Criteria API 中的 Case Expressions 可以解决这个问题。

    CriteriaBuilder cb = entityManager.getCriteriaBuilder()
    
    cb.selectCase(color)
    .when(color.YELLOW, 1)
    .when(color.YELLOW, 2)
    .otherwise(3))
    

    【讨论】:

    • 但现在我得到错误:- java.lang.ClassCastException: color cannot be cast to org.hibernate.ejb.criteria.Renderable at org.hibernate.ejb.criteria.expression.SimpleCaseExpression.render (SimpleCaseExpression.java:146) 在 org.hibernate.ejb.criteria.expression.SimpleCaseExpression.renderProjection(SimpleCaseExpression.java:157) 在 org.hibernate.ejb.criteria.expression.CompoundSelectionImpl.render(CompoundSelectionImpl.java:99) 在org.hibernate.ejb.criteria.QueryStructure.rende 中的 org.hibernate.ejb.criteria.expression.CompoundSelectionImpl.renderProjection(CompoundSelectionImpl.java:110)
    • hibernate.onjira.com/browse/HHH-6747 - 这是一个已知但被忽略的错误。与 eclipselink 一起工作,它也有与 case 表达式相关的烦人的简单错误:)。试试cb.selectCase() .when(cb.equals(color, color.YELLOW), 1) .when(cb.equals(color, color.RED), 3) .otherwise(2)
    • 刚刚测试了解决方法,由于三年前的错误hibernate.onjira.com/browse/HHH-4700,它不起作用,所以也许唯一的可能性是自己修补hibernate或去其他JPA提供商:)跨度>
    【解决方案3】:

    这应该可以了,你只需要用 asc 或 desc 包装 case 表达式。

    你试过什么代码,你得到了什么错误?

    看, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Criteria#Order

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    相关资源
    最近更新 更多