java.lang.ClassCastException:[Ljava.lang.Object; 无法施展

为什么在我的程序中触发了java.lang.ClassCastException?

java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为com.App.Equip]

该查询返回已回答的检查表列表(在CheckLists calsse中找到)但尚未通过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 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 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 checks; @ManyToOne @JoinColumn(name="actifs_id") private Actifs actifsEquipements; } 

我想以Json格式格式化我的SQl查询的结果。 以下是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 ] ...... ] 

谁能介意给我一些建议?

非常感谢!!!

您的查询返回了一个Object[] List Object[]因为您没有选择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 res = query.getResultList(); List list= new ArrayList(); 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); } 

query.getResultList()返回List

因此,您可以使用JPA查询返回List

来自JPA 2.0

使用映射实体(如Jure 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是您的Entity类中的字段

@ColumnResult是ResultList中不存在于Entity类中的结果列

请在此处查看完整示例

通过使用List解决了我的问题:使用以下代码:

 List res = query.getResultList(); List list= new ArrayList(); 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