java枚举异常

java枚举异常,java,sql,Java,Sql,我有枚举类 package org.testTask.DTO; public enum Publisher { MOSCOW("МОСКВА"), ST_PETERSBURG("ПИТЕР"), O_REILLY("O’REILLY"); private String name; private long id;

我有枚举类

    package org.testTask.DTO;
    
    public enum Publisher {
        MOSCOW("МОСКВА"),
        ST_PETERSBURG("ПИТЕР"),
        O_REILLY("O’REILLY");
    
        private String name;
    
        private long id;
    
        Publisher(final String name) {
            this.name = name;
            this.id = ordinal();
        }
    
        public String getName() {
            return name;
        }
    
        public long getId() {
            return id;
        }
    }
SQL请求

protected Publisher getObject(ResultSet resultSet) throws SQLException {
    return Publisher.valueOf(resultSet.getString("NAME"));
}
以及数据库中的变量,其值为“МöССБА”、“ПППППСМППППППММПППППМПППППППП。但它给了我一个错误
java.lang.IllegalArgumentException:没有枚举常量org.testTask.DTO.Publisher.ППППППППППМППППП

我不明白问题出在哪里。

valueOf
不能那样工作。您必须为它指定一个enum成员的名称,即
valueOf(“莫斯科”)

您所称的“名称”不是枚举的名称。该名称是您可以在源代码Publisher.MOSCOW中编写的内容


为了便于按(俄语)名称查找,您需要在枚举成员列表中搜索具有匹配(俄语)名称的成员。如果你有3个以上的名字,一张地图对提高效率很有用,但我不会为少数出版商费心。

你的Enum成员是英文名字,而不是俄文名字。
您应该将
MOSCOW
ST_PETERSBURG
O_REILLY
传递到
valueOf()
。valueOf
方法返回指定枚举类型的枚举常量,并使用指定的名称,表示
。valueOf(“ST_PETERSBURG”)
不是从
name
字段返回

您需要将enum常量的
name
字段与数据库值匹配,并获取enum

protected Publisher getObject(ResultSet resultSet) throws SQLException {
    String enumName = resultSet.getString("NAME")
    return  Arrays.stream(Publisher.values())
                            .filter(e -> e.getName().equals(enumName))
                            .findFirst().orElse(null);
}

我需要返回与数据库中“名称”列中的值同名的发布服务器。因此,我将“NAME”传递给resultSet.getString()以获取该列中的字符串。很好,但是您被卡住了。您可以声明
enum Publisher{МССБА,ПППППППСМПППППППППППППППППППППППППППППППП。因此,您需要编写一些东西,将数据库中的数据转换为Java程序中枚举成员的名称。在枚举中有一个名为
getName()
的方法是令人困惑的,考虑到还有一个方法
name()
。您应该重命名它。另外,不要对
id
值使用
ordinal()
。首先,为什么要复制它?但另一方面,枚举中的更改很脆弱(例如,如果某种灵魂按字母顺序排列列表会怎么样?)。向构造函数提供显式id值。