我正在使用以下非常基本的代码。我使用Hibernate对内部应用程序的只读Oracle数据库运行本机SQL查询。我允许用户定义查询以便以后运行。
大多数查询都会返回行集,这意味着有很多列,也可能有很多行。
但是,假设有人使用"从DUAL中选择系统日期"来测试一些东西。。。这将返回一个具有Timestamp类型的单个项的Object[],因此下面的代码将爆炸,因为它无法将Timestamp强制转换为Object[]
我如何通过反射或其他东西来判断外部数组中的内容,从而知道如何处理它?如果它只是一个对象而不是数组,我只想对它执行字符串()操作。如果它是一个数组,我想将每行的第一列字符串化为一个字符串。我知道很奇怪,但我真的在这里学习。
List<Object[]> rows = sqlQuery.list();
String result = "";
if (rows.isEmpty())
return "NORESULTS";
else
{
for(Object[] row : rows){
result+=row[0].toString();
}
return result;
}
您可以使用obj.getClass().isArray()
检查对象是否为数组,并使用Array.get(obj, index)
检索第一个索引。但请确保在数组为空的情况下处理ArrayIndexOutOfBoundsException
。
private static String asString(Object obj) {
if (obj == null)
return "null";
Class<?> clazz = obj.getClass();
if (clazz.isArray()) {
try {
Object first = Array.get(obj, 0);
return String.valueOf(first);
} catch (ArrayIndexOutOfBoundsException e) {
return "empty array";
}
} else {
return String.valueOf(obj); // primitive or non-array object
}
}
public static void main(String[] args) {
Integer integer = Integer.valueOf(4);
String[] stringArray = new String[] { "a", "b" };
String nothing = null;
int primitive = 4;
char[] primitiveArray = { 'a', 'b' };
int[] emptyArray = new int[0];
System.err.println(asString(integer)); // 4
System.err.println(asString(stringArray)); // a
System.err.println(asString(nothing)); // null
System.err.println(asString(primitive)); // 4
System.err.println(asString(primitiveArray)); // a
System.err.println(asString(emptyArray)); // empty array
}
我希望这是你所要求的。
编辑
这是结果列表:
private static List<String> rowsAsString(List<?> rows) {
if (rows == null || rows.isEmpty())
return Collections.emptyList();
List<String> strings = new ArrayList<>(rows.size());
for (Object row : rows) {
strings.add(asString(row));
}
return strings;
}