How to control fetched sub entities spring boot

Viewed 41

I have following relationship in my spring boot:

public class Clazz {

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "lesson_id")
    @NotNull(message = "{lesson.is_required}")
    private Integer lessonId;

    @Column(name = "level_id")
    @NotNull(message = "{level.is_required}")
    private Integer levelId;

    @Column(name = "name")
    @NotEmpty(message = "{name.is_required}")
    private String name;

    @OneToOne
    @JoinColumn(name = "lesson_id", referencedColumnName = "id", insertable = false, updatable = false)
    private Lesson lesson;

    @OneToOne
    @JoinColumn(name = "level_id", referencedColumnName = "id", insertable = false, updatable = false)
    private Level level;
}

Now my Lesson entity has Level entity:

public class Lesson {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    @NotEmpty(message = "{name.is_required}")
    private String name;

    @Column(name = "description")
    private String description = "";

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "lesson_id")
    Collection<Level> levels = new ArrayList<>();
}

And finally my Level class:

public class Level {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "id", insertable = false, updatable = false)
    private Integer id;

    @Column(name = "lesson_id")
    private Integer lessonId;

    @Column(name = "name")
    private String name;

    @Column(name = "step")
    private Integer step;

    @Column(name = "description")
    private String description="";
}

With this relationship defined, when I fetch data, getting some extra info in my results:

[
    {
        "id": 2,
        "lessonId": 1,
        "levelId": 1,
        "name": "English Class March",
        "branch": {
            "id": 1,
            "name": "3 mikr branch",
            "email": "",
            "phone": "",
            "address": "3 mikr, foo, bar"
        },
        "lesson": {
            "id": 1,
            "name": "math",
            "description": "math lesson",
            "levels": [
                {
                    "id": 1,
                    "lessonId": 1,
                    "name": "First level",
                    "step": 1,
                    "description": "1st level descr"
                }
            ]
        },
        "level": {
            "id": 1,
            "lessonId": 1,
            "name": "First level",
            "step": 1,
            "description": "1st level descr"
        }
    }
]

How can I tell JPA not to fetch sub-entities, ideally I do not need levels in lesson field of result.

1 Answers

Use @JsonIgnore. It can be used at setter,getter or field. Please refer the code below.

public class Lesson {
    @Id    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    @NotEmpty(message = "{name.is_required}")
    private String name;

    @Column(name = "description")
    private String description = "";

    @JsonIgnore // Add this to ignore the property in json output
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "lesson_id")
    Collection<Level> levels = new ArrayList<>();
}
Related