大家好,我在一个使用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
该异常表示您正在尝试将Object数组转换为ArrayList。因此,为了解决这个问题,您可以在服务类中使用以下代码行:
Object[] results = null;
results = serviceAutoWiredVariable.queryWithValues();
我使用的是在查询本身中显式定义我的类类型,并在自定义对象中创建参数化构造函数,其中包括我希望从查询输出加载的所有属性。
所以仓库类看起来像这样:
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,而无需任何显式强制转换。
对象[]
不能强制转换为任何其他类型(除了对象
)。时期
如果您希望您的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查询返回的和(等等)相同的值)来选择?