У меня есть Java-приложение для отдыха, где я хочу отображать некоторую информацию как json.У меня есть два класса сущностей в игре прямо сейчас Pet и Event.Отношений слишком много, поэтому у одного питомца есть коллекция событий.
ранее я составил список питомцев сущностей и создал собственные статические методы для преобразования сущностей питомцев в объекты DTO следующим образом:
@Path("/allPets")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getPetsfromCollection() {
List<Pet> petList = new ArrayList<>();
List<DTOPet> DTOPetList = new ArrayList<>();
// here i'm looping through my list and then converting them to DTO object, and adding dem to a string called json
petList.addAll(facade.returnAllPets());
for(Pet pet: petList){
DTOPet dtopet = EntitytoDTO.convertDTOPet(pet);
DTOPetList.add(dtopet);
}
String json = gson.toJson(DTOPetList);
return Response.ok().entity(json).build();
}
Теперь я хочу сделать то же самое, ноЯ хочу показать коллекцию событий внутри PetDTO aswell
Вот мой класс PetDTO
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package DTO;
import Entities.Event;
import java.util.Collection;
import java.util.Date;
/**
*
* @author kristoffer
*/
public class DTOPet {
private Integer id;
private String name;
private Date birth;
private String species;
private Date death;
private Collection<DTOEvent> eventCollection;
public DTOPet(Integer id, String name, Date birth, String species, Date death, Collection<DTOEvent> eventCollection) {
this.id = id;
this.name = name;
this.birth = birth;
this.species = species;
this.death = death;
this.eventCollection = eventCollection;
}
public DTOPet() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
public Date getDeath() {
return death;
}
public void setDeath(Date death) {
this.death = death;
}
public Collection<DTOEvent> getEventCollection() {
return eventCollection;
}
public void setEventCollection(Collection<DTOEvent> eventCollection) {
this.eventCollection = eventCollection;
}
}
Как я могу это сделать?
Я перепробовал несколько методов, но пока ничего не получилось.
Вот что я получил до сих пор:
@Path("/allPetsE")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getEventofPets() {
//med denne metode skal vi bruge et DTO(data transfer object til at formatere til Json)
List<Pet> petList = new ArrayList<>();
List<DTOPet> DTOPetList = new ArrayList<>();
List<Event> eventList = new ArrayList<>();
List<DTOEvent> DTOevents = new ArrayList<>();
petList.addAll(facade.returnAllPets());
eventList.addAll(facade.returnAllEvents());
//dette er ikke en pæn løsning, men lad os prøve at få hver event lavet om til et DTO og tilføje det til de forskellige dyr
for(Pet pet: petList){
DTOPet dtopet = EntitytoDTO.convertDTOPet(pet);
dtopet.setEventCollection(DTOevents);
DTOPetList.add(dtopet);
//dette bliver ikke performance optimere i føste omgang, vi skal bare få det til at virke
}
String json = gson.toJson(DTOPetList);
return Response.ok().entity(json).build();
}
проблема с моим кодом заключается в том, что у меня есть коднет способа конвертировать всю коллекцию объектов Event Entity в объекты DTO, я мог бы попытаться выполнить цикл внутри метода, но это могло бы оказать ужасное влияние на производительность, в противном случае я мог бы попытаться сделать запрос JPQL, но это все равно не решило быпреобразование в объекты DTO.
Другим способом решения этой проблемы было изменение повторного типа моего текущего запроса JPQL следующим образом:
public Collection<Event> returnAllEvents (){
EntityManager em = emf.createEntityManager();
//vi laver en typed query for at specificere hvilken datatype, det er vi leder efter, i dette tilfælde er det en Pet
TypedQuery<Event> query = em.createNamedQuery("Event.findAll", Event.class);
return query.getResultList();
}
, чтобы вместо этого он возвращал коллекцию коллекций, но яЯ не уверен, как это сделать.