枚举字段的自定义排序顺序

时间:2015-11-03 20:28:57

标签: hibernate postgresql jpa

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

我在列division中有这些数据:

BRONZE
SILVER
GOLD
DIAMOND

我已将其映射到实体字段:

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

@Entity
public class MyEntity {

  @Enumerated(EnumType.STRING)
  private Division division;

  ...
}

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

  • RONZE
  • d IAMOND
  • <强“G OLD
  • 取值 ILVER

但是我希望按照矿石的质量进行分类(按照枚举的顺序)。

3 个答案:

答案 0 :(得分:4)

排序(或排序)发生在数据库级别。因此,无法定义自定义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;

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

答案 1 :(得分:0)

@OrderBy注释,但它仅在集合级别上可用。 http://www.objectdb.com/api/java/jpa/OrderBy

答案 2 :(得分:0)

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

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