2016-01-06 59 views
1

我正在使用以下非常基本的代碼。我正在使用Hibernate針對內部應用的只讀Oracle數據庫運行本機SQL查詢。我允許用戶定義查詢以便以後運行。如何知道Hibernate .list()方法中的返回值是數組還是標量?

大多數查詢都會返回行集,這意味着許多列和可能很多行。

但是,可以說有人使用「從DUAL中選擇sysdate」來測試某個東西......這將返回一個Object []與Timestamp類型的單個項目,所以下面的代碼會因爲無法投射而爆炸時間戳到對象[]

我如何用反射或其他方法告訴外層數組中的內容以便知道如何處理它?如果它只是一個對象而不是數組,我只想toString()它。如果它是一個數組,我想將每行的第一列變成單個字符串。奇怪我知道,但我也在這裏學習。

List<Object[]> rows = sqlQuery.list(); 

String result = ""; 
if (rows.isEmpty()) 
return "NORESULTS"; 
else 
{ 
    for(Object[] row : rows){ 
     result+=row[0].toString(); 
    } 
    return result; 
} 

回答

0

您可以使用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; 
} 
+0

是的!這打擊了頭部!感謝您及時的回覆! –

相關問題