是否可以将JPA中的字母排序更改为自定义?
我在列division
中有这些数据:
BRONZE
SILVER
GOLD
DIAMOND
我已将其映射到实体字段:
public enum Division {
BRONZE,
SILVER,
GOLD,
DIAMOND
}
@Entity
public class MyEntity {
@Enumerated(EnumType.STRING)
private Division division;
...
}
如果我使用默认排序,我会按字母顺序排序:
但是我希望按照矿石的质量进行分类(按照枚举的顺序)。
答案 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();