Devuelve una copia superficial de un objeto en JpaRepository findAll () método

Rohan Shah:

Estoy tratando de recuperar una lista de entidades que utilizan JpaRepository's findAll()método, pero la entidad que estoy tratando de recuperar tiene un número de otros objetos como OneToManyla relación dentro de él.

Tengo una clase Programde la siguiente manera:

@Entity
public class Program extends BaseEntity {

    private String programTitle;

    private String description;

    private String programType;

    private String price;

    @OneToMany(mappedBy = "program", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JsonManagedReference(value = "program-benefit")
    private List<Benefit> benefits = new ArrayList<>();

    @Column(name = "category")
    private String category;
    //Getters and setters
    }

Como se puede ver, tiene una lista de Benefitsen ella.

Cuando estoy tratando de recuperar Programa, estoy consiguiendo un JSON que tiene tanto la lista de objetos en él también, como:

Respuesta estoy consiguiendo:

{
    "id":1,
    "category": "cardio",
    "description": "exercies for cardio",
    "benefit": [
        {
            "description": "good for healt"
        },
        {
            "description": "string2"
        }
    ],
    "price": "50",
    "program_title": "cardio demo"
}

Pero quiero una copia superficial del objeto como

Respuesta esperada:

{
    "id":1,
    "category": "cardio",
    "description": "exercies for cardio",
    "price": "50",
    "program_title": "cardio demo"
}

He intentado cambiar CascadeTypepero sería dejar de mostrar objetos anidados en todas las API, sólo quiero los objetos anidados para ser retirados cuando llamo findAll()método.

¿Hay una manera de detener la presentación de objetos anidados cuando llamo al findAll()método?

Andrónico:

Veo dos opciones:

  1. Si se quiere evitar la serialización de los campos inverosímiles, utilice @JsonIgnore.

  2. Si no se desea obtener esos campos en absoluto, crear un DTO y escribir una consulta personalizada para asignar los resultados a la misma:

    public class ProgramDTO {
    
        private Long id;
        private String programTitle;
        private String description;
        private String programType;
        private String price;
    
    }
    

    Y entonces:

    entityManager
        .createQuery("select new ProgramDTO(p.id, p.programTitle, p.description, p.programType, p.price from Program p")
        .getResultList();
    

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=280138&siteId=1
Recomendado
Clasificación