2017-05-31 15 views
1

java.lang.ClassCastException:[Ljava.lang.Object;私のプログラムでjava.lang.ClassCastExceptionがトリガーされたのはなぜですか?

java.lang.ClassCastException:[Ljava.lang.Object;クエリは、(チェックリストcalsseに見出さ)応答されたチェックリストのリストを返し、まだ装備オブジェクトが応答しなかっ

-Hereコードである com.App.Equip]

にキャストすることはできません:

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クラス:私は私のSQの結果をフォーマットしたい

@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; 
} 

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();'によって返されるリストには純粋なObject要素があり、これはEquipにキャストできないため、実際の問題を理解するためには使用しているクラスへの参照が必要です。 – bracco23

+0

この行の 'for(Equip eq:res)// - 問題はここにあります - ' – Michael1

答えて

1

あなたがEquipエンティティを選択されていませんが、あなただけの列を選択しているので、あなたのクエリはObject[]Listを返して:HibernateはEquipエンティティオブジェクトにResultSet結果を変換しません

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は選択された列の型を決定しないため、結果はobjectの配列になります。

この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 ":" Description: ...... "、 } – Michael1

+0

このオブジェクトの配列を覆う必要があります。 –

+0

どのように@chsdk、?私はJavaの初心者です – Michael1

1

query.getResultListは、()(ユレKolenkoが言ったように)List<Object[]>

ですから、JPA 2.0からList<Equip>または

を返すために、JPAのクエリを使用するか

使用は

エンティティをマッピングし返します
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があなたからの結果列であるフィールドですEntityクラスに存在しない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

関連する問題