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 OneToMany
la relación dentro de él.
Tengo una clase Program
de 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 Benefits
en 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 CascadeType
pero 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?
Veo dos opciones:
Si se quiere evitar la serialización de los campos inverosímiles, utilice
@JsonIgnore
.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();