【问题标题】:Retrieving SQL enum causes java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String检索 SQL 枚举导致 java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String
【发布时间】:2010-08-25 13:01:57
【问题描述】:

我有这样的查询

Query importQuery = advertiserDao.getEntityManager().createNativeQuery(
    "select matching_type from group_key where key_id = " + Key.getkeyId());
String match = (String) importQuery.getSingleResult();

matching_typeenum('good', 'bad', 'repared') 类型。这给出了如下异常:

java.lang.ClassCastException: java.lang.Character cannot be cast to java.lang.String

什么意思,实际值是一个字符串。我该如何解决这个问题?

【问题讨论】:

  • 看来matching_type是长度为1的varchar,我
  • 它是一个枚举类型,抱歉之前没有提到..

标签: java jpa


【解决方案1】:

按照异常的建议尝试使用 java.lang.Character 变量:

Character match = (Character) importQuery.getSingleResult();

【讨论】:

    【解决方案2】:

    这很奇怪。根据官方文档,一个 MySQL ENUM 类型肯定应该以 String 形式返回(实际上任何 MySQL 数据类型都可以转换为String):

    21.4.4.3. "Java, JDBC and MySQL Types"

    MySQL Connector/J 在 它处理之间转换的方式 MySQL 数据类型和 Java 数据类型。

    一般来说,任何 MySQL 数据类型都可以 转换为java.lang.String,并且 任何数字类型都可以转换为 任何 Java 数字类型, 尽管舍入、溢出或丢失 可能会出现精度问题。

    从 Connector/J 3.1.0 开始, JDBC 驱动程序将发出警告或 按原样抛出 DataTruncation 异常 JDBC 规范要求 除非配置了连接 不要通过使用该属性来这样做 jdbcCompliantTruncation 并设置它 到false

    始终如一的转化 保证工作列在 下表:

    连接属性 - 其他。

    These MySQL Data Types           | Can always be converted to these Java types
    ---------------------------------+---------------------------------------------
    CHAR, VARCHAR, BLOB, TEXT, ENUM, | java.lang.String, java.io.InputStream,
    and SET                          | java.io.Reader, java.sql.Blob, java.sql.Clob
    ---------------------------------+---------------------------------------------
    

    ResultSet.getObject() 方法 使用之间的类型转换 MySQL 和 Java 类型,遵循 适当的 JDBC 规范。 返回的值 ResultSetMetaData.GetColumnClassName() 也如下图所示。更多 关于java.sql.Types的信息 类请参阅 Java 2 平台类型。

    ResultSet.getObject() 的 MySQL 类型到 Java 类型。

    MySQL Type Name             | Return value of    | Returned as Java Class
                                | GetColumnClassName | 
    ----------------------------+--------------------+-----------------------
    ...                         | ...                | ...
    ----------------------------+--------------------+-----------------------
    ENUM('value1','value2',...) | CHAR               | java.lang.String
    

    我怀疑是 JDBC 驱动程序错误。你用的是什么版本?您可以尝试使用更新的版本吗?可以使用原始 JDBC 吗?

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 2021-01-17
      • 2022-12-04
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多