Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringData/Hibernate:按它对枚举进行排序';s场_Java_Hibernate_Sorting_Enums_Spring Data - Fatal编程技术网

Java SpringData/Hibernate:按它对枚举进行排序';s场

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

我在使用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.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