【问题标题】:JPA: PGobject cannot be castJPA:PGobject 不能被强制转换
【发布时间】:2013-02-18 18:31:52
【问题描述】:

我是第一次使用 JPA,当我尝试查询 postgres 数据库时遇到此错误:

Exception in thread "main" java.lang.ClassCastException: org.postgresql.util.PGobject cannot be cast to [Ljava.lang.Object;

代码是:

List<Results> r = em.createNativeQuery("SELECT r FROM RESULTS r\n"
            + "INNER JOIN SESSION S ON s.SESSION_ID = r.SESSION_ID WHERE s.SESSION_ID = '" + sessionId + "'").getResultList();

我已经尝试过使用 Object[],但错误仍然相同

List<Object[]> r = em.createNativeQuery("SELECT r FROM RESULTS r\n"
            + "INNER JOIN SESSION S ON s.SESSION_ID = r.SESSION_ID WHERE s.SESSION_ID = '" + sessionId + "'").getResultList();

有人知道怎么了?

【问题讨论】:

    标签: java postgresql jpa casting


    【解决方案1】:

    我注意到您正在对 nativeQuery 使用 JPQL 语法,您是否使用 createQuery 方法()尝试过这段代码?

    List<Results> r = em.createQuery("SELECT r FROM RESULTS r\n"
                + "INNER JOIN SESSION S ON s.SESSION_ID = r.SESSION_ID WHERE s.SESSION_ID = '" + sessionId + "'").getResultList();
    

    如果 sql 是正确的,并且您使用的是本机查询,那么

    Query query = em.createNativeQuery(SELECT * FROM RESULTS r\n"
                    + "INNER JOIN SESSION S ON s.SESSION_ID = r.SESSION_ID WHERE s.SESSION_ID = '" + sessionId + "'");
    List<Object[]> result = query.getResultList();
    

    返回没有类转换异常?

    【讨论】:

    • 感谢您的回答。是的,我使用的是 createQuery,但是这种方法给了我 sintax 错误。所以我开始使用带有 SQL 代码的 createNativeQuery。上面的代码是 SQL 和它的权利,因为它在 postgres 控制台中工作。
    • 如果您尝试返回 List 会发生什么?
    • 快速查找 PGObject 表明 PGobject 是一个用于描述未知类型的类 未知类型是 JDBC 标准未知的任何类型。如果不行,我就简化一下sql语句……看看能不能映射一两列。
    • 使用 select * 而不是 r 更新了 nativeQuery 示例的答案。希望这不会返回 PGObject。如果是这样,我会打开 show sql 并查看您的 jpa 提供程序发送到您的数据库的内容。
    • 没问题,我猜你的查询的“SELECT r FROM RESULTS r”部分没有正确映射并给你PGObject。通常,当我看到类似“SELECT r FROM RESULTS r”的内容时,我会假设它是 jpql,它会给你 List。如果该查询在 Postgres 控制台中有效,则它可能是有效的 postgres sql,但对于您的 jpa 实现来说不是有效的 sql。例如,如果我想在 Oracle 上运行相同的 sql,“SELECT r FROM RESULTS r”将产生“R”:无效标识符错误。相反,我不得不说“SELECT r.* FROM RESULTS r”
    【解决方案2】:

    假设您使用的是 SQL 而不是 JPQL,那么您为什么不直接使用它呢?

    List<Object> result = query.getResultList();
    

    由于您只在 SQL 中选择单个列,因此将每一行映射到一个对象更有意义。

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      相关资源
      最近更新 更多