Возвращает поверхностную копию объекта в методе JpaRepository findAll () - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь получить список сущностей, используя метод JpaRepository findAll(), но сущность, которую я пытаюсь получить, имеет ряд других объектов как OneToMany Отношения внутри.

У меня есть класс Program следующим образом:

@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
    }

Как видите, в нем есть список Benefits.

Когда я пытаюсь получить программу , Я получаю JSON, в котором есть оба списка объектов, например:

Ответ, который я получаю:

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

Но я хочу мелкая копия объекта типа

Ожидаемый ответ:

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

Я попытался изменить CascadeType, но он перестал бы показывать вложенные объекты во всех API, я только хотите удалить вложенные объекты при вызове метода findAll().

Есть ли способ прекратить показывать вложенные объекты при вызове метода findAll()?

1 Ответ

2 голосов
/ 13 марта 2020

Я вижу два варианта:

  1. Если вы хотите избежать сериализации выбранных полей, используйте @JsonIgnore.

  2. Если вы не вообще не нужно извлекать эти поля, создать DTO и написать собственный запрос для сопоставления результатов с ним:

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

    А затем:

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