2017-05-31 30 views
1

爲什麼在我的程序中觸發java.lang.ClassCastException?java.lang.ClassCastException:[Ljava.lang.Object;不能投到

java.lang.ClassCastException:[Ljava.lang.Object;不能被轉換到 com.App.Equip]

查詢返回都回答清單(中的清單找到calsse)的列表和通過裝備對象

,尤其是圓形尚未回答是代碼:

import org.json.simple.*; 

    @SuppressWarnings("unchecked") 

public JSONObject ListCheckListsNonETRepondu(long idEqp, long idmiss){ 

     Query query = manager.createNativeQuery("SELECT" 
     + " checksl.id_check_lists as IdCheckLists," 
     + " checksl.titre_check as NomCheckLists," 
     + " checksl.recommendation as Recommendation, " 
     + " resp.id_responsescheck as IdResponse, " 
     + " resp.conformite as Conformite, " 
     + " resp.date_response as DateResponse, " 
     + " resp.missions_id as IdMission " 
     + " FROM equipements eq " 
     + " LEFT JOIN check_lists checksl" 
     + " ON eq.id_equipements= checksl.equipements_id " 
     + " LEFT JOIN responses_check_lists resp " 
     + " ON checksl.id_check_lists = resp.check_lists_id " 
     + " AND resp.missions_id ="+idmiss+"" 
     + " AND eq.id_equipements ="+idEqp 
     + " ORDER BY checksl.id_check_lists" 
     ); 

    List<Equip> res = query.getResultList(); 

    JSONObject obj = new JSONObject(); 

    for(Equip eq: res) //--The problem is here -- 
    { 
     for(CheckLists checks : eq.getChecks()) 
     { 
       obj.put("idCheckLists", checks.getIdCheckLists()); 
       obj.put("NomCheckLists", checks.getTitreCheck()); 
       obj.put("Recommendation", checks.getRecommendation()); 

       for(ResponsesCheckLists resp :checks.getResponsesChecks()) 
       { 
        obj.put("IdResponse",resp.getIdResponsesCHeck()); 
        obj.put("DateResponse",resp.getDateResponse()); 
        obj.put("Conformite",resp.isConformite()); 
        obj.put("IdMission",resp.getRespmission().getIdMission()); 
       } 
     } 

    } 
    return (JSONObject)obj; 
    } 

- 我的java類:

@Entity 
public class CheckLists implements Serializable{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="idCheckLists") 
    private long idCheckLists; 

    @Column(name="titreCheck") 
    private String titreCheck; 

    @Column(name="recommendation") 
    private String recommendation; 

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinColumn(name="equipements_id") 
    @JsonBackReference 
    private Equipements equipements; 

    @OneToMany(mappedBy="CheckLts", cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    //@Fetch(value = FetchMode.SUBSELECT) 
    private Set<ResponsesCheckLists> ResponsesChecks; 
.. 
} 

// 
@Entity 
public class ResponsesCheckLists implements Serializable{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="idResponsesCHeck") 
    private long idResponsesCHeck; 

    @Column(name="conformite") 
    private boolean conformite; 

    @Column(name="dateResponse") 
    private String dateResponse; 

    @ManyToOne 
    @JoinColumn(name="missionsId") 
    private Missions Respmission; 

    @ManyToOne 
    @JoinColumn(name="checkLists_Id") 
    private CheckLists CheckLts; 

.... 
} 

// 
@Entity 
public class Equip implements Serializable{ 


    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="idEquipements") 
    private long idEquipements; 

    @Column(name="nomEq") 
    private String nomEq; 

    @Column(name="dateAjoutEq") 
    private String dateAjoutEq; 

    @Column(name="dateModificationEq") 
    private String dateModificationEq; 

    @OneToMany(mappedBy="equipements", cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
    //@Fetch(value = FetchMode.SUBSELECT) 
    @JsonManagedReference 
    private Set<CheckLists> checks; 

    @ManyToOne 
    @JoinColumn(name="actifs_id") 
    private Actifs actifsEquipements; 
} 

我要格式化我的SQ的結果l以Json格式查詢。 這裏是SQL查詢返回query.getResultList()

[ 
    [ 
    1, 
    "2.1 Create Separate Partition ", 
    "Description.... ", 
    1, 
    false, 
    "25/05/2017", 
    15 
    ], 
    [ 
    2, 
    "2.2 Set nodev option ", 
    " Description:.... ", 
    1, 
    false, 
    "25/05/2017", 
    15 
    ] 
...... 
] 

會有人介意給我一些建議嗎?

非常感謝!

+0

在哪條線這個異常被拋出? –

+0

什麼是裝備?什麼是查詢?你在用圖書館嗎?主要的問題可能是'query.getResultList();'返回的列表具有不能轉換爲Equip的純Object元素,因此需要引用您正在使用的類來理解實際問題。 – bracco23

+0

在這行中for(Equip eq:res)// - 問題在這裏 - ' – Michael1

回答

1

您的查詢返回的Object[]一個List因爲你沒有選擇Equip實體,但你只能在選擇列:

Query query = manager.createNativeQuery("SELECT" 
    + " checksl.id_check_lists as IdCheckLists," 
    + " checksl.titre_check as NomCheckLists," 
    + " checksl.recommendation as Recommendation, " 
    + " resp.id_responsescheck as IdResponse, " 
    + " resp.conformite as Conformite, " 
    + " resp.date_response as DateResponse, " 
    + " resp.missions_id as IdMission " 

Hibernate不會在ResultSet結果轉換爲Equip實體對象,結果將是一個object的數組,因爲Hibernate不會確定所選列的類型。

您需要遍歷此List元素並手動將每個Object[]轉換爲Equip對象。

編輯:

這是你應該如何實現它:

List<Object[]> res = query.getResultList(); 
List<Equip> list= new ArrayList<Equip>(); 
JSONObject obj = new JSONObject(); 

Iterator it = res.iterator(); 
while(it.hasNext()){ 
    Object[] line = it.next(); 
    Equip eq = new Equip(); 
    eq.setIdEquipement(line[0]); 
    eq.setTitre(line[1]); 
    eq.setDescription(line[2]); 
    //And set all the Equip fields here 
    //And last thing add it to the list 

    list.add(eq); 
} 
+0

如何獲得Object []中的文本並像這樣顯示它:{ 「idEquipement」:「1」, 「titre」:2.1創建單獨的分區, 「description」:「描述: ......「, }' – Michael1

+0

你需要關閉這個對象數組。 –

+0

@chsdk,?我是java初學者 – Michael1

1

query.getResultList()返回List<Object[]>

所以,你既可以使用JPA查詢返回List<Equip>

從JPA 2.0

使用映射實體(如法理Kolenko說)

createNativeQuery(sql, Equip.class) 

來自JPA 2.1

如果你想你的映射結果POJO類使用SqlResultSetMapping

例子:

Query q = em.createNativeQuery(
    "SELECT o.id AS order_id, " + 
     "o.quantity AS order_quantity, " + 
     "o.item AS order_item, " + 
     "i.name AS item_name, " + 
    "FROM Order o, Item i " + 
    "WHERE (order_quantity > 25) AND (order_item = i.id)", 
"OrderResults"); 

@SqlResultSetMapping(name="OrderResults", 
    entities={ 
     @EntityResult(entityClass=com.acme.Order.class, fields={ 
      @FieldResult(name="id", column="order_id"), 
      @FieldResult(name="quantity", column="order_quantity"), 
      @FieldResult(name="item", column="order_item")})}, 
    columns={ 
     @ColumnResult(name="item_name")} 
) 

@FieldResult是從實體類領域

@ColumnResult從結果列中選擇您不存在於您的實體類中的ResultList

請參閱完整示例here

+0

我不明白這行是什麼:'@ColumnResult(name =「item_name」)}'@Mike Adamenko – Michael1

+0

我已經更新了答案 –

+0

非常感謝你好@Mike Adamenko – Michael1

0

我的問題是通過使用列表的解決:使用下面的代碼:

List<Object[]> res = query.getResultList(); 
List<Equip> list= new ArrayList<Equip>(); 

Iterator it = res.iterator(); 
while(it.hasNext()){ 
    Object[] line = it.next(); 
    Equip eq = new Equip(); 
    eq.setIdEquipement(line[0]); 
    eq.setTitre(line[1]); 
    eq.setDescription(line[2]); 

    list.add(eq); 
} 

之後返回list