Java JPA:PGobject无法强制转换

Java JPA:PGobject无法强制转换,java,postgresql,jpa,casting,Java,Postgresql,Jpa,Casting,我是第一次使用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"

我是第一次使用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();

有人知道出了什么问题吗?

我注意到您正在对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();

返回时没有类强制转换异常?

假设您使用的是SQL而不是JPQL,那么为什么不使用这个呢

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

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

谢谢您的回答。是的,我使用的是createQuery,但是这个方法给了我sintax错误。因此,我开始在SQL代码中使用createNativeQuery。上面的代码是SQL及其右边的代码,因为它在postgres控制台中工作。如果尝试返回列表会发生什么?快速查找PGObject时,它声明PGObject是用于描述未知类型的类未知类型是JDBC标准未知的任何类型。如果它不起作用,我会简化sql语句…看看它是否可以映射为一列或两列。使用select*而不是r更新了nativeQuery示例的答案。希望这不会返回PGObject。如果是的话,我会打开ShowSQL并查看jpa提供程序正在向数据库发送什么。没问题,我猜查询的SELECT r FROM RESULTS r部分没有正确映射,并且没有为您提供PGObject。通常,当我看到类似于从结果r中选择r的内容时,我假设它是jpql,它会给出一个列表。如果该查询在Postgres控制台中工作,那么它可能是有效的Postgres sql,但对于jpa实现来说不是有效的sql。例如,如果我想在Oracle上运行相同的sql,从RESULTS r中选择r将产生r:invalid identifier错误。相反,我必须说从结果r中选择r.*