如何知道Hibernate.list()方法中的返回值是数组还是标量



我正在使用以下非常基本的代码。我使用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;
}

最新更新