【问题标题】:Custom sort order for an enum field枚举字段的自定义排序顺序
【发布时间】:2015-11-03 20:28:57
【问题描述】:

是否可以将 JPA 中的字母排序更改为自定义?

我在division 列中有这些数据:

BRONZE
SILVER
GOLD
DIAMOND

我已经将它映射到一个实体字段:

public enum Division {
    BRONZE,
    SILVER,
    GOLD,
    DIAMOND
}

@Entity
public class MyEntity {

  @Enumerated(EnumType.STRING)
  private Division division;

  ...
}

如果我使用默认排序,我会得到字母顺序:

  • BRONZE
  • DIAMOND
  • G
  • SILVER

但我想按矿石质量排序(按枚举顺序)。

【问题讨论】:

    标签: hibernate postgresql jpa


    【解决方案1】:

    排序(或排序)发生在数据库级别。因此,不可能定义自定义 Comparator 或类似的 - 如果这是您的意图。相反,数据库需要知道质量以某种方式将其用作订单标准。

    一个选项是按枚举的序数排序。仅当您将其存储在数据库中时才有可能 - 而不是名称:

    @Enumerated(EnumType.ORDINAL) // The default
    private Division division;
    

    第二种选择是将enum 转换为Entity 并将质量显式存储为新的整数字段。这样做的缺点是,您不能再使用常量值了。

    第三个选项Formula字段,具有显式名称到质量映射(您也可以按公式字段排序):

    @Enumerated(EnumType.STRING)
    private Division division;
    
    @Formula("case division when 'BRONZE' then 0 when 'SILVER' then 1 ... end")
    private int divisionQuality;
    

    这是最慢的选项 - 如果您的表中有很多行。

    【讨论】:

    • 是否可以使用条件查询按@Formula 列排序?
    • 是的,这就是我发帖的目的。我不止一次地创建了一个公式,特别是用于排序(我的意思是更复杂的表达式)。如果您启用或模拟字节码增强,您甚至可以将公式标记为LAZY,在这种情况下,该公式仅用于排序
    【解决方案2】:

    您可以像这样进行自定义查询,以根据需要对枚举进行排序:

        @Query("SELECT e FROM Entity e ORDER BY (CASE WHEN e.enumField = 'ENUM_VALUE' THEN 0 else 1 END)")
    List<Entity> findAllInOrder();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2012-03-10
      相关资源
      最近更新 更多