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
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
我们之后返回list