java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为
为什么在我的程序中触发java.lang.ClassCastException java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为 com.App.equipment] 该查询返回设备对象已应答(在checklists calsse中找到)但尚未应答的检查表列表 -代码如下: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
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);
}