2017-01-31 108 views
1

我使用此本機查詢來獲取數據。 select c.id,c.name from customer c,information i where i.status=1 and c.id=i.customerId 和我用下面的代碼到對象列表轉換成整數列表作爲如何將對象的ArrayList轉換爲java中的Integer列表

public List<Integer> getAllIdsByGroupId(Integer groupId) throws Exception { 
    List<Object[]> list = repository.getAllIdsByGroupId(groupId); 
    List<Integer> ids = repository.mapIds(list); 
    return ids; 
} 


public List<Object[]> getAllIdsByGroupId(Integer groupId) { 
    Query query = entityManager.createNativeQuery("select c.id,c.name from customer c,information i where i.status=1 and c.id=i.customerId and c.groupId=:groupId"); 
    query.setParameter("groupId", groupId); 
    List<Object[]> list = query.getResultList(); 
    if (list == null || list.isEmpty()) { 
     return null; 
    } 
    return list; 
} 


public List<Integer> mapIds(List<Object[]> list) { 
    List<Integer> ids = new ArrayList<Integer>(); 
    if (list != null && !list.isEmpty()) { 
     Integer id; 
     for (Object[] object : list) { 
      id = (object[0] != null ? (Integer) object[0] : null); 
      ids.add(id); 
     } 
    } 
    return ids; 
} 

查詢檢索與ID的列表和name.and上面的代碼給出輸出,而不exception.But我需要列表僅IDS 。當我從查詢中刪除c.name如下 select c.id from customer c,information i where i.status=1 and c.id=i.customerId 上述代碼失敗,併產生異常

java.lang.Integer cannot be cast to [Ljava.lang.Object; 

任何幫助?提前致謝。

+0

*什麼*對象列表?這是SQL嗎?來自JPA提供者的本地查詢? OrientDB? – chrylis

+1

請包括[mcve]。 – shmosel

+4

它在我看來就像你的'list'已經是'Integer'的列表。 –

回答

2

問題是在類型轉換 變化 List<Object[]> list = query.getResultList();

List<Object> list = query.getResultList()

它是對象,其中爲你的代碼試圖轉換和整型成陣的名單列表。

List<Integer> list = query.getResultList()也就夠了,如果你只是試圖讓IDS

+0

如果select語句包含多個列(如上例(id,name)),它將不起作用。對於單列情況列表應該運行沒有問題 - 不需要先將結果列表分配給列表,然後再次遍歷整個列表以便將Object轉換爲整數。 –

+0

@ZaurGuliyev我根據submiitter提出的查詢提出的問題進行了回答,其中說:「我需要僅帶有ID的列表。當我從查詢中刪除c.name時,如下所示 從客戶c選擇c.id,其中i.status = 1和c.id = i.customerId 上述代碼失敗併產生異常 java.lang.Integer不能轉換爲[Ljava.lang.Object;「他只需要id,並且想知道爲什麼代碼拋出ClassCastException – Optimus

+0

不需要將從query.getResultList()獲得的結果強制轉換爲列表,該列表已經返回列表以單一表達式進行選擇(請檢查我的答案中的一般規則)。正確的代碼是:列表 list = query.getResultList(); –

0

嘗試在我的編輯這樣一個可能不嘗試,但可能我的這個解決方案可以幫助您的事情之一。

public List<Integer> mapIds(List<Object[]> list) { 
    List<Integer> ids = new ArrayList<Integer>(); 
    if(list != null && !list.isEmpty()) { 
     int id; 
     for(Object[] object : list) { 
      id = (int) (object[0] != null ? object[0] : null); 
      ids.add(id); 
    } 
} 
return ids; 
} 
+0

它給出了同樣的例外。當查詢同時檢索c.id和c.name時,它工作正常。並且只在檢索c.id時失敗 –

0

雖然問題是缺乏大量的信息,爲ClassCastException最可能的原因是,你要鑄造的Integer型不型Integer對象。我不確定列表中是否包含傳入該方法的列表,但如果列表確實包含某些類型爲Integer的對象,那麼您可以嘗試的是在將元素object[0]轉換爲Integer,

public List<Integer> mapIds(List<Object[]> list) { 
    List<Integer> ids = new ArrayList<Integer>(); 
    if (list != null && !list.isEmpty()) { 
     Integer id; 
     for (Object[] object : list) { 
      id = ((object[0] != null && object[0] instanceof Integer) ? (Integer) object[0] : null); 
      ids.add(id); 
      } 
     } 
    } 
    return ids; 
} 

但是,如果在list的對象不包含任何Integer對象,然後再實現自己在做什麼的唯一途徑就是通過某種方式檢索每個int值初始化爲每object[0]一個Integer對象。只有你知道如何做到這一點。

+0

它給出相同的異常。 –

2

如果您使用JPA/Hibernate獲取單列數據,則隱式返回List<Integer>(基於該列的類型),因此不需要將其轉換爲整數列表。

一般規則:

  • 如果您選擇一個實體,那麼結果就是實體的列表類型項目
  • 如果您選擇的是原始的,那麼結果就是原始的包裝類型的產品清單。
  • 如果要選擇多個表達式(ID,名稱),那麼結果是對象[]含有相應的原語/實體
+0

如何將對象列表分配到整數列表中 –

+0

只需使用列表而不是列表 - 它應該按照一般規則工作 - 更新我的答案幷包含其他規則。 –

+0

感謝您的回答。 –

相關問題