以下代码有什么问题?
List<Object[]> currencies = null;
List<String> currencyList = new ArrayList<String>();
//code to fetch currency
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);
currencies = currencyQuery.getResultList();
for (Object[] currency : currencies) { //getting runtime error here
for (int i = 0; i < currency.length; i++) {
currencyList.add(currency[i].toString());
}
}
在for循环的第一行中获取运行时错误: java.lang.ClassCastException:java.lang.String与[Ljava.lang.Object;
不兼容代码编译正常。
问题是什么?
答案 0 :(得分:2)
我不确定您为什么认为Query会返回Object
数组的列表。
查询很可能返回String
的列表(除非Currency实体包含Currency对象,在这种情况下我会重新访问数据设计),因此在假设这是标量的情况下运行查询,您的代码可以简化为:
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);
List<String> currencyList = (List<String>) currencyQuery.getResultList();
答案 1 :(得分:0)
在
之后检查调试器中的货币变量currencyQuery.getResultList();
可能它不是Object []的列表,而是字符串列表。
答案 2 :(得分:0)
问题是currencyList
应该是List
类型而不是List<Object[]>
类型。这也意味着循环中的currency
变量应该是Object
类型,因此它实际上与String
兼容(异常来自的地方)。然后,您需要验证是否有字符串。
或者,您在SQL中获得了足够的信息,以确保结果真的是List<String>
,这反过来又允许您将currency
声明为{{1}类型}}。但这将涉及一个正式不安全的演员;这将是一个你知道它是正确的地方,但编译器没有,所以你会得到一个警告。这将是一个适当的地方来抑制警告(只是在那一个任务/演员;你想试图避免抑制警告,因为这可以掩盖严重的问题)。
答案 3 :(得分:0)
我认为您从查询中获取货币列表存在问题。你不需要创建另一个数组。试试这个
List<String> currencyList = new ArrayList<String>();
//code to fetch currency
String currencySql = "select C.Currency from Currency C";
Query currencyQuery = this.em.createQuery(currencySql);
currencies = currencyQuery.getResultList();
for (String currency : currencies) {
currencyList.add(currency);
}