在JavaRESTAPI中将集合从实体转换为DTO

在JavaRESTAPI中将集合从实体转换为DTO,java,json,rest,jpa,jpql,Java,Json,Rest,Jpa,Jpql,我有一个JavaREST应用程序,我想在其中以json的形式显示一些信息。我现在有两个实体类在游戏中,宠物和事件。关系太多了,所以一只宠物有一系列事件 在此之前,我列出了实体Pet,并制定了自定义静态方法,将Pet实体转换为DTO对象,如下所示: @Path("/allPets") @GET @Produces(MediaType.APPLICATION_JSON) public Response getPetsfromCollection() { List<Pet>

我有一个JavaREST应用程序,我想在其中以json的形式显示一些信息。我现在有两个实体类在游戏中,宠物和事件。关系太多了,所以一只宠物有一系列事件

在此之前,我列出了实体Pet,并制定了自定义静态方法,将Pet实体转换为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();
}
@Path(“/allPets”)
@得到
@产生(MediaType.APPLICATION_JSON)
公共响应getPetsfromCollection(){
List petList=new ArrayList();
List DTOPetList=new ArrayList();
//在这里,我循环遍历我的列表,然后将它们转换为DTO对象,并将dem添加到名为json的字符串中
addAll(facade.returnAllPets());
用于(宠物:宠物列表){
DTOPet DTOPet=实体TODTO.CONVERTDOPET(pet);
添加(dtopet);
}
字符串json=gson.toJson(DTOPetList);
返回Response.ok().entity(json.build();
}
现在我想做同样的事情,但我想在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;
}
/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
*要更改此模板文件,请选择工具|模板
*然后在编辑器中打开模板。
*/
包DTO;
导入实体。事件;
导入java.util.Collection;
导入java.util.Date;
/**
*
*@作者克里斯托弗
*/
公共类DTOPet{
私有整数id;
私有字符串名称;
私人日期出生;
私有串种;
私人约会死亡;
私人收藏;
公共DTOPet(整数id、字符串名称、出生日期、字符串种类、死亡日期、集合事件集合){
this.id=id;
this.name=名称;
这个.出生=出生;
这个物种=物种;
死亡=死亡;
this.eventCollection=eventCollection;
}
公共DTOPet(){
}
公共整数getId(){
返回id;
}
公共无效集合id(整数id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公众出生日期(){
回生;
}
公共出生日期(出生日期){
这个.出生=出生;
}
公共字符串getSpecies(){
返回物种;
}
公共空间集合物种(字符串物种){
这个物种=物种;
}
公众死亡日期(){
返回死亡;
}
公众死亡(死亡日期){
死亡=死亡;
}
公共集合getEventCollection(){
返回事件收集;
}
public void setEventCollection(集合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();
}
@Path(“/allPetsE”)
@得到
@产生(MediaType.APPLICATION_JSON)
公共响应getEventofPets(){
//med denne metode skal vi bruge et DTO(数据传输对象til at Formatter til Json)
List petList=new ArrayList();
List DTOPetList=new ArrayList();
List eventList=new ArrayList();
List DTOevents=new ArrayList();
addAll(facade.returnAllPets());
addAll(facade.returnAllEvents());
//在fåhver活动中,男人们的生活一直持续到最后一天
用于(宠物:宠物列表){
DTOPet DTOPet=实体TODTO.CONVERTDOPET(pet);
dtopet.setEventCollection(DTOevents);
添加(dtopet);
//我在福斯特·奥姆冈(føste omgang)的ikke性能最佳,在维克(virke)之前,我将一直保持赤裸的fådet(fådet)
}
字符串json=gson.toJson(DTOPetList);
返回Response.ok().entity(json.build();
}
我的代码的问题是,我无法将整个事件实体对象集合转换为DTO对象,我可以尝试在方法内部循环,但这会对性能产生可怕的影响,或者我可以尝试进行JPQL查询,但这仍然无法解决转换为DTO对象的问题

另一种解决方法是将returntype更改为我当前的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();
}
public Collection returnAllEvents(){
EntityManager em=emf.createEntityManager();
//特定hvilken数据类型的vi-laver en类型查询,详细信息vi-leder efter,详细信息tilfælde er det en Pet
TypedQuery query=em.createNamedQuery(“Event.findAll”,Event.class);
返回query.getResultList();
}

因此,它将返回一个集合,但我不确定如何执行此操作

你找到更好的方法了吗?除了迭代集合???