java.lang.ClassCastException: [Ljava.lang.Object; 不能投射到
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/44285188/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to
提问by Michael1
why java.lang.ClassCastException is triggered in my program ?
为什么在我的程序中会触发 java.lang.ClassCastException ?
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.App.Equip]
java.lang.ClassCastException: [Ljava.lang.Object; 不能投射到 com.App.Equip]
The query returns the list of checklists that are answered (found in the CheckLists calsse) and not yet answered by Equip object
查询返回已回答(在 CheckLists calsse 中找到)但尚未由 Equip 对象回答的清单列表
-Here is the code:
- 这是代码:
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 classes:
-我的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<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;
}
I want to format the result of my SQl query in Json format.
Here is what the SQL query returns query.getResultList()
:
我想以 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
]
......
]
could anyone mind giving some advice for me?
谁能介意给我一些建议?
Thanks a lot!!!
非常感谢!!!
回答by cн?dk
Your query is returning a List
of Object[]
because you aren't selecting an Equip
Entity, but you are only selecting columns in :
您的查询返回 a List
ofObject[]
因为您没有选择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 won't convert the ResultSet
results to an Equip
entity object, the result will be an array of object
s because Hibernate won't determine the types of selected columns.
Hibernate 不会将ResultSet
结果转换为Equip
实体对象,结果将是object
s的数组,因为 Hibernate 不会确定所选列的类型。
You need to loop over this List
elements and transform each Object[]
to an Equip
object manually.
您需要遍历这些List
元素并手动将每个元素转换Object[]
为一个Equip
对象。
Edit:
编辑:
This is how you should implement it:
这是你应该如何实现它:
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);
}
回答by Michael1
My problem is solved through the use of the List: using the following code:
我的问题是通过使用 List: 解决的,代码如下:
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);
}
We return afterwards list
之后我们回来 list
回答by Mike Adamenko
query.getResultList()
returns List<Object[]>
query.getResultList()
回报 List<Object[]>
So you can either use JPA query to return List<Equip>
or
因此,您可以使用 JPA 查询返回List<Equip>
或
From JPA 2.0
从 JPA 2.0
use mapped entities (as Jure Kolenko said)
使用映射实体(如 Jure Kolenko 所说)
createNativeQuery(sql, Equip.class)
From JPA 2.1
从 JPA 2.1
If you want map your result to POJO class use SqlResultSetMapping
如果要将结果映射到 POJO 类,请使用SqlResultSetMapping
Example:
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")} )
例子:
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
is the field from your Entity class
@FieldResult
是来自您的实体类的字段
@ColumnResult
is the result column from your ResultList that not exist into the your Entity class
@ColumnResult
是您的 ResultList 中不存在于您的实体类中的结果列
See complete example here
在此处查看完整示例