java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为

java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为,java,jpa,Java,Jpa,为什么在我的程序中触发java.lang.ClassCastException java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为 com.App.equipment] 该查询返回设备对象已应答(在checklists calsse中找到)但尚未应答的检查表列表 -代码如下: import org.json.simple.*; @SuppressWarnings("unchecked") public JSONObject

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

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

该查询返回设备对象已应答(在checklists 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; 
   }
谁能给我提些建议吗

非常感谢!!!

query.getResultList()
返回
List

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

来自JPA 2.0

使用映射实体(如Jure Kolenko所说)

来自JPA 2.1

如果要将结果映射到POJO类,请使用

例如:

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
是结果列表中不存在于实体类中的结果列


请参阅完整示例

您的查询将返回
对象[]
列表
,因为您没有选择
设备
实体,而只选择了以下列中的列:

   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不会将
结果集
结果转换为
设备
实体对象,结果将是
对象
的数组,因为Hibernate不会确定所选列的类型

您需要循环此
列表
元素,并手动将每个
对象[]
转换为
装备
对象

编辑:

以下是您应该如何实施它:

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);
}
List res=query.getResultList();
列表=新的ArrayList();
JSONObject obj=新的JSONObject();
迭代器it=res.Iterator();
while(it.hasNext()){
Object[]line=it.next();
装备均衡=新装备();
等式setIdEquipement(第[0]行);
等式设定值(第[1]行);
等式setDescription(第[2]行);
//把所有装备场都放在这里
//最后一件事是把它添加到列表中
列表。添加(eq);
}

我的问题通过使用列表解决:使用以下代码:

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 res=query.getResultList();
列表=新的ArrayList();
迭代器it=res.Iterator();
while(it.hasNext()){
Object[]line=it.next();
装备均衡=新装备();
等式setIdEquipement(第[0]行);
等式设定值(第[1]行);
等式setDescription(第[2]行);
列表。添加(eq);
}

我们随后返回
list

在哪一行引发此异常?什么是设备?什么是查询?您是否在使用某个库?主要问题可能是
Query.getResultList()返回的列表
具有无法强制转换为装备的纯对象元素,需要对您使用的类进行引用才能理解真正的问题。在这一行中,
for(equid eq:res)/--问题就在这里--
您的查询正在返回一个对象。请使用createNativeQuery(String sqlString,Class resultClass)带有类参数的方法,例如
createNativeQuery(sql,Equipment.class)
。如果查询返回列名没有映射到实体类,这可能不起作用。@bracco23我更新了帖子,thanksHow以获取对象[]中的文本,并按如下方式显示
{“idEquipement”:“1”,“titre”:2.1创建单独的分区,“description”:“Description:…”,}
你需要仔细观察一下这个对象数组。how@chsdk,我是这方面的初学者java@Michel检查我的编辑。谢谢你的回复@chsdk,我现在就测试。我不明白这行是什么:
@columnsult(name=“item_name”)}
@MikeAdamenko@MikeAdamenko这不是从这个url复制粘贴吗-->>需要删除这个..@VikrantKashyap这个例子是从url链接
SQLResultsMapping
复制的,就在这个例子的正上方完整的例子链接被破坏了
   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 "
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);
}
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);
}