Java SpringData/Hibernate:按它对枚举进行排序';s场
我在使用springdata/hibernate按自定义规则对枚举进行排序时遇到了一个小问题 A有一个名为:DeviceState的枚举,它有自己的优先级字段Java SpringData/Hibernate:按它对枚举进行排序';s场,java,hibernate,sorting,enums,spring-data,Java,Hibernate,Sorting,Enums,Spring Data,我在使用springdata/hibernate按自定义规则对枚举进行排序时遇到了一个小问题 A有一个名为:DeviceState的枚举,它有自己的优先级字段 public enum DeviceState { ON(4), OFF(3), UPDATE(2), CRITICAL(0), WARNING(1); private final int priority; private DeviceState(int priority) { this.pri
public enum DeviceState {
ON(4), OFF(3), UPDATE(2), CRITICAL(0), WARNING(1);
private final int priority;
private DeviceState(int priority) {
this.priority = priority;
}
public int getPriority() {
return priority;
}
}
枚举由DeviceEntity使用:
@Entity
public class Device implements Serializable {
// .... other fields
@Enumerated(EnumType.STRING)
private DeviceState state;
// ....
}
我使用SpringData/Repository从数据库中获取实体,我使用了org.springframework.data.Repository.Respository类中的findAll(规范,可分页)方法
Page<Device> pagedDevices = deviceRepository.findAll(DeviceSpecifications.findByFilter(filter), pageable);
Page pagedDevices=deviceposition.findAll(设备规范.findByFilter(过滤器),可分页);
如果我的请求cointains sort=state,它将返回按状态排序的设备-按字母顺序,但我想使用优先级字段作为排序标准
我试过什么:
将@Enumerated(STRING)更改为@Enumerated(ORIDINAL)-但这不会发生。这是一个具有现有数据的生产工作系统,外部系统正在使用多个设备,我的项目需要字符串值
但我不能添加任何新列,因为我已经有了生产数据,并且所有枚举值都作为字符串持久化
我还尝试了一些包装页面结果的“变通方法”——但这些只是变通方法,不是纯粹的解决方案:)
有线索吗,救命?主意
请记住,这是生产工作系统,我不能做任何“焰火”。我以前想使用该解决方案,但我使用spring data/repository findAll(规范,可分页)方法,我唯一可以自定义的是规范(查询过滤器)。可分页上下文(第一个结果、最大结果、大小、排序等)由spring数据维护——所以我不能修改它。因此,这个解决方案可能还可以,但在我的情况下就不行了。无论如何,谢谢你;)ps:我还尝试使用javax.persistence中的@Formula注释。失败:(添加到@siepyta comment中,您实际上可以使用criteria builder将所有排序逻辑移动到查询中。在切换到spring数据之前,在项目中有此功能。看起来非常难看。。。
order by case
when state = 'CRITICAL' then 0
when state = 'WARNING' then 1
when state = 'UPDATE' then 2
when state = 'OFF' then 3
when state = 'ON' then 4
end