List我有一個查詢,它會像這樣生成一個Tickets使用休眠的查詢:
Query query = session.createQuery(
"SELECT T.id, T.Objet, T.Details, T.Etat,T.Severity, T.createDateTime, T.user, T.Attachment, U.lastName, L.nomLogiciel, V.nomVersion,T.AssignedTo,T.ClosedBy,T.closedDateTime,T.assignedDateTime, U.firstName, U.username, U.Email, U.Phone FROM Ticket T, User U, Logiciel L, Version V "
"WHERE T.user= :user and T.user=U.user_id AND L.logiciel_id=T.Logiciel AND T.Version=V.version_id AND T.Etat!='fermer' ORDER BY T.createDateTime ")
.setParameter("user", user);
我試圖
What the hell is causing this ?! I checked my Entity definitions and they look alright to me.
Side note
My Ticket object contains the User object, which contains a list of the Users's Tickets, and it goes on and on forever, infinite recursion, is this normal ? are my Entity definitions wrong ? how can i fix this ?
uj5u.com熱心網友回復:
我看到你設法修復它,但我會添加另一個選項以確保完整性。我設法用兩個簡單的類重新創建了你的確切例外,它們的實體形成一個回圈參考,就像你的情況一樣。
用戶:
public class User {
private long id;
private Ticket ticket;
public User(long id) {
this.id = id;
}
//getters and setters
}
票
public class Ticket {
private long id;
private User user;
public Ticket(long id) {
this.id = id;
}
//getters and setters
}
設定:
User user = new User(1);
Ticket ticket = new Ticket(2);
user.setTicket(ticket);
ticket.setUser(user);
List<User> users = Arrays.asList(user, user, user);
與您的情況一樣,這些實體相互參考無窮大。這在java中完全有效,但很難用json表示。根據我的測驗直接添加集合,原因Exception in thread "main" org.json.JSONException: JavaBean object contains recursively defined member variable of key "ticket".
JSONObject jsonObject = new JSONObject();
jsonObject.put("users", users);
System.out.println(jsonObject);
jsonObject.put(key, collection)從集合中創建 json 陣列,但由于某種原因無法處理集合元素中的回圈參考。
修復它的解決方法JSONArray是手動創建,然后迭代集合,手動添加每個元素 JSONArray。然后將準備好的 json 陣列添加到JSONObject.
JSONArray jsonArray = new JSONArray();
users.forEach(jsonArray::put);
JSONObject jsonObject = new JSONObject();
jsonObject.put("users", jsonArray);
System.out.println(jsonObject);
uj5u.com熱心網友回復:
您可以使用地圖。
Map<String,Object> mapObject = new HashMap<>();
List allTickets = ticketDao.getTicketsByUserDao(user);
mapObject.put("ticket",allTickets);
uj5u.com熱心網友回復:
錯誤 :
allTicketsList 包含一個無限遞回物件,因此User無法決議為JSONObject.
是什么原因造成的?
這個查詢:
Query query = session.createQuery(
"SELECT T.id, T.Objet, T.Details, T.Etat,T.Severity, T.createDateTime, T.user, T.Attachment, U.lastName, L.nomLogiciel, V.nomVersion,T.AssignedTo,T.ClosedBy,T.closedDateTime,T.assignedDateTime, U.firstName, U.username, U.Email, U.Phone FROM Ticket T, User U, Logiciel L, Version V "
"WHERE T.user= :user and T.user=U.user_id AND L.logiciel_id=T.Logiciel AND T.Version=V.version_id AND T.Etat!='fermer' ORDER BY T.createDateTime ")
.setParameter("user", user);
重點在T.user這里:
表中沒有呼叫列,而是呼叫User了, 所以方法回傳了一個無限遞回物件的實體,而不是回傳的是一個, *我認為*.Ticketsuser_idquery.list()Useruser_idinteger
修復
更改T.user為T.user_id。
現在可以將 List 決議為JSONObjectnow 而沒有錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424552.html
標籤:java json list hibernate jpa
