В настоящее время мой проект использует @Enumerated (EnumType.ORDINAL)
, поэтому, когда я сортирую по этому столбцу, он упорядочивается по порядку в перечисление
, которое работает нормально. Но мне нужно добавить некоторые дополнительные значения в перечисление
, которые должны быть вставлены в разные места в списке значений перечисления и не могут быть просто добавлены внизу, чтобы поддерживать правильный порядок сортировки.
Если я сделаю это, моя база данных будет испорчена. Мне придется написать несколько сценариев, чтобы перевести все эти порядковые значения в правильный новый порядковый номер. Существует вероятность того, что статус будет добавлен позже. Поскольку мне нужно исправить все данные в базе данных, я бы хотел сделать это только один раз, так как это будет большая задача.
Так что я Я думаю о переключении на EnumType.STRING
, чтобы больше не приходилось переназначать порядковые значения в базе данных. Но если я делаю это, то как мне правильно сортировать? Алфавитный порядок строк enum не тот, который мне нужен.
Используя приведенные ниже классы, когда я сортирую по свойству «status», результаты получаются в следующем порядке:
hql = "from Project order by status"
Development
Planning
Production
Я бы хотел, чтобы они пришли в этом порядке, без использования EnumType.ORDINAL
:
Planning
Development
Production
Это возможно без создания таблицы для перечисления
или добавления дополнительного столбца в проект
класс? Я пробовал это, но выдает исключение:
hql = "from Project order by status.sort"
Перечисление:
public enum Status {
PLANNING("Planning", 0),
DEVELOPMENT("Development", 1),
PRODUCTION("Production", 2);
private final String name;
private final int sort;
private Status(String name, int sort) {
this.name = name;
this.sort = sort;
}
@Override
public String toString() {
return name;
}
}
Сущность:
@Entity
public class Project {
private Long id;
private Status status;
@Id
@GeneratedValue
public Long getId() {
return this.id;
}
private void setId(Long id) {
this.id = id;
}
@Enumerated(EnumType.STRING)
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}