当前位置: 首页 > 知识库问答 >
问题:

如何强制转换Spring数据JPA查询返回的[Ljava.lang.Object

壤驷阳冰
2023-03-14

大家好,我在一个使用SpringDataJPA的SpringMVC项目中工作,我在一个从JpaRepository扩展而来的接口中有一个nativeQuey,在该查询中,我从不同的表中选择一些值,并返回一个

ArrayList<Object>

我打印了该ArrayList的值,其内容如下:

[[Ljava.lang.Object;@1f634fe, [Ljava.lang.Object;@1361a15, [Ljava.lang.Object;@1c8c51c]

由于查询返回3行,每行有7个值,我怀疑这些对象是3(列表),每个列表有7个字段,我非常确定它们是字符串和int,我在类中有两个导入,我想在其中强制转换值。

import java.util.ArrayList;
import java.lang.Object;

我的问题是,我如何在3个列表中转换这些列表以获得我的值?

这是我的类,它扩展了JpaRepository

import java.util.ArrayList;
import java.lang.Object;
public interface I_GL_JE_Lines extends JpaRepository<C_GL_JE_LINES, Long>{

@Query(value ="select value1, value2, value3, value4, value5"
            + "from DB_Table, DB_Table2, DB_Table3"
            + "where id_value = 1 ", 
           nativeQuery = true)
    public ArrayList<Object> queryWithValues();

我的服务类MyServiceClass中的方法。爪哇:

import java.util.ArrayList;
import java.lang.Object;


public ArrayList<Object> getQueryValues() {

            ArrayList<Object> results = null;

            results = serviceAutoWiredVariable.queryWithValues();

        return results;
    }

还有我的控制器类,在这里我尝试获取我的值

@Autowired MyServiceClass_autoWiredServiceClassVariable;

@RequestMapping(value = "/getVaules", method = RequestMethod.GET)
    public String getValues(Model model) 
    {
ArrayList<Object> objectlist = null;

objectlist = _autoWiredServiceClassVariable.getQueryValues(); <--i call my method here and it return the lists that have 3 lists inside with 7 or more values each

.... HERE i want an idea how to get those values or how to cast them

 //i tried this but i gives me this exception 
//java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList


Iterator itr = objectlist .iterator();
Iterator innerIterator;
while(itr.hasNext())
            {
                ArrayList<Object> obj = (ArrayList<Object>) itr.next(); 

                innerIterator= obj.iterator();

                while(iteradorInterno.hasNext())
                {
                    Object[] innerObj = (Object[]) innerIterator.next();

                    value = String.valueOf(innerObj[0]);
                }

            }

这一行:

ArrayList<Object> obj = (ArrayList<Object>) itr.next(); 

给我一个例外:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.ArrayList

共有3个答案

从智明
2023-03-14

异常表示您正在尝试将Object数组转换为ArrayList。因此,为了解决这个问题,您可以在服务类中使用以下代码行:

Object[] results = null;

results = serviceAutoWiredVariable.queryWithValues();
权弘新
2023-03-14

我使用的是在查询本身中显式定义我的类类型,并在自定义对象中创建参数化构造函数,其中包括我希望从查询输出加载的所有属性。

所以仓库类看起来像这样:

    public interface CustomObjectDAO extends CrudRepository<CustomObject, Integer> {

        @Query("SELECT new CustomObject(obj.attribute1, obj.attribute2, 
                obj.attribute3, obj.attribute4) from CustomObject obj where 
                obj.attribute2 not in ("SELECT obj2.id FROM 
                AnotherCustomObject obj2)")
        List<CustomObject> findByCustomObject();
    }

以下是CustomObject的外观:

public class CustomObject{
    private int attribute1;
    private String attribute2;
    private String attribute3;
    private String attribute4;

    public CustomObject(){}

    public CustomObject(int attribute1, String attribute2, String attribute3, String attribute4, String attribute5){
        this.attribute1 = attribute1;
        this.attribute1 = attribute2;
        this.attribute1 = attribute3;
        this.attribute1 = attribute4;
        this.attribute1 = attribute5;
    }

    //getters and setters
}

这样,它将把列表强制转换为CustomObject,而无需任何显式强制转换。

何兴邦
2023-03-14

对象[]不能强制转换为任何其他类型(除了对象)。时期

如果您希望您的Object[]实例可用作列表,那么您需要将它们复制到新的List对象中,或者使用Arrays.asList()包装它们。

另一种方法(理论上!)就是说服JPA将结果集中的行映射到除Object[]之外的其他对象。然而,我的(有限的)研究并没有揭示一种方法来做到这一点。。。。至少,使用Spring数据@Query注释。

 类似资料:
  • 我有一个带有嵌入Id的类。当我尝试使用Jpa存储库进行搜索时,它只返回一个空对象。问题似乎出在嵌入式Id中,因为我用一个没有这个Id的类进行了测试,结果很好。 当我针对数据库进行测试时,JPA在控制台中输出的查询工作正常。 并且没有输出错误。 编辑:数据库中有数据 EDIT2:添加了equals和hashcode。 编辑3:findAll方法有效。 实体 嵌入ID 存储库 服务 正如你所看到的,我

  • 我们使用1.3.5版本创建了一个spring boot项目。我们的应用程序与Mysql数据库交互。我们创建了一组JPA存储库,在其中我们使用了findAll、findOne和其他自定义查询方法。 我们正面临一个随机出现的问题。以下是复制它的步骤: > 使用spring启动应用程序在数据库上启动读取查询。 现在,使用mysql-console手动更改上面读取查询返回的记录的Mysql中的数据。 再次

  • 在我的Spring数据应用程序中,我遇到了这里描述的类似问题ClassCastException:在尝试迭代实体ID时,Integer不能强制转换为Long 我正在接收- 我正在接收-

  • 我试图返回一个列表,并将该响应重定向到我的模型类。 例如:如果我使用,它工作得很好,但我不想为每个模型编写响应方法。 方法 错误 出现错误(Type=内部服务器错误,状态=500)。创建名为“index”的bean时出错:调用init方法失败;嵌套异常为java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为com.xxx.Applic

  • 我尝试通过methodhandles将方法链接在一起,其中一些方法来自泛型类型。如果函数返回泛型类型,我必须为MethodType指定Object.Class,但我看不到将其转换回泛型类型参数类型的简单方法。在大多数情况下,这没有问题,因为invoke似乎自动转换它们,但我必须创建mhs,它可以用InvokeExact运行。难道没有简单的方法使用MethodHandles进行强制转换吗? 我的测试

  • 我有一个对象,它扩展了。默认情况下,这两个对象都在我的Derby数据库的表中(包含中的字段)。通常我会选择,如下所示: 但是,由于查询的复杂性,我使用的是本机查询,如下所示: 但这会引发一个强制转换异常。我认为这是由于中的任何字段。 我的问题是,如何使用具有相等结果的本机查询作为第一个示例(包括与JPQL查询返回的和(等等)相同的值)来选择?