2017-05-31 3 views
1

umgewandelt werden, warum java.lang.ClassCastException in meinem Programm ausgelöst wird?java.lang.ClassCastException: [Ljava.lang.Object; kann nicht in

java.lang.ClassCastException: [Ljava.lang.Object; kann nicht auf com.App.Equip]

Die Abfrage gibt die Liste der Checklisten umgewandelt werden, die durch Anlegen und noch nicht beantwortet Objekt

-Hier ist der Code (in der Prüflisten calsse gefunden) beantwortet werden :

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

-My Java-Klassen:

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

ich das Ergebnis meiner SQ zu forma l Abfrage im JSON-Format. Hier ist, was die SQL-Abfrage gibt 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 
    ] 
...... 
] 

könnte jemand Geist für mich einen Rat geben?

Vielen Dank !!!

+0

Bei welcher Linie Diese Ausnahme wird ausgelöst? –

+0

Was ist Equip? Was ist Abfrage? Benutzt du eine Bibliothek? Das Hauptproblem besteht wahrscheinlich darin, dass die von 'query.getResultList(); zurückgegebene Liste reine Objektelemente enthält, die nicht in Equip umgewandelt werden können. Ein Verweis auf die von Ihnen verwendeten Klassen ist notwendig, um das eigentliche Problem zu verstehen. – bracco23

+0

In dieser Zeile 'für (Equip eq: res) // - Das Problem ist hier -' – Michael1

Antwort

1

Ihre Anfrage wird Zurückgeben eines List von Object[] weil Sie keine Equip Entity auswählen, aber Sie sind die Auswahl nur Spalten in:

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 wird nicht wandeln die ResultSet Ergebnisse zu einem Equip Entitätsobjekt Das Ergebnis ist ein Array von object s, da Hibernate die Typen ausgewählter Spalten nicht bestimmt.

Sie müssen diese List Elemente durchlaufen und jede Object[] manuell in ein Equip Objekt umwandeln.

Edit:

Dies ist, wie Sie es umsetzen sollte:

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

Wie man den Text in Object [] erhält und es so anzeigt '{ " idEquipement ":" 1 ", " titre ": 2.1 Separate Partition erstellen, " description ":" Beschreibung: ...... ", }' – Michael1

+0

Sie müssen über dieses Array von Objekten blättern. –

+0

wie @chsdk ,? Ich bin ein Anfänger in Java – Michael1

1

query.getResultList() gibt List<Object[]>

So können Sie entweder JPA Query List<Equip> oder

Von JPA 2.0

Verwendung abgebildet Einheiten zurückzukehren (wie Jure Kolenko sagte)

createNativeQuery(sql, Equip.class) 

Von JPA 2.1

Wenn Sie Ihr Ergebnis zu POJO Klasse Verwendung zuordnen möchten SqlResultSetMapping

Beispiel:

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 ist das Feld von Ihrer Entity-Klasse

@ColumnResult aus der Ergebnisspalte ist Ihre ResultList, das nicht in Ihrer Entitätsklasse vorhanden ist

Siehe vollständiges Beispiel here

+0

Ich habe nicht verstanden, was diese Zeile ist: '@ColumnResult (name =" Element_Name ")} @Mike Adamenko – Michael1

+0

Ich habe die Antwort –

+0

Vielen Dank aktualisiert nett von dir @Mike Adamenko – Michael1

0

Mein Problem durch die Verwendung der Liste gelöst: mit dem folgenden Code:

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

Wir kommen danach zurück list

Verwandte Themen