I have 3 entities Movie, Show and Theatre with below relationship
Relations
 @Entity
@Table(name = "theatre")
public class Theatre {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "town")
    private String town;
    @OneToMany(mappedBy = "theatre", orphanRemoval = true)
    private List<Show> shows = new ArrayList<>();
    public List<Show> getShows() {
        return shows;
    }
    public void setShows(List<Show> shows) {
        this.shows = shows;
    }
    public String getTown() {
        return town;
    }
    public void setTown(String town) {
        this.town = town;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}
@Entity
@Table(name = "show")
public class Show {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;
    @ManyToOne
    @JoinColumn(name = "theatre_id")
    private Theatre theatre;
    @ManyToOne
    @JoinColumn(name = "movie_id")
    private Movie movie;
    public Movie getMovie() {
        return movie;
    }
    public void setMovie(Movie movie) {
        this.movie = movie;
    }
    public Theatre getTheatre() {
        return theatre;
    }
    public void setTheatre(Theatre theatre) {
        this.theatre = theatre;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}
@Entity
@Table(name = "movie")
public class Movie {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;
    @Column(name = "name")
    private String name;
    @OneToMany(mappedBy = "movie", orphanRemoval = true)
    private List<Show> shows = new ArrayList<>();
    public List<Show> getShows() {
        return shows;
    }
    public void setShows(List<Show> shows) {
        this.shows = shows;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}
Now when I try to fetch list of Theatres for a movie name I'm getting infinite nested result. As a result I'm getting StackOverflow error as well.
Is criteria query not suitable here? Or the relationship is wrong? Or criteria query is wrong itself.
Criteria query
public List<Theatre> findTheatresByMovieAndDate(String movieName) {
        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Theatre> query = builder.createQuery(Theatre.class);
        Root<Theatre> fromTheatres = query.from(Theatre.class);
        Join<Theatre, Show> shows = fromTheatres.join("shows");
        Join<Show, Movie> movie = shows.join("movie");
        List<Predicate> conditions = new ArrayList<>();
        conditions.add(builder.equal(movie.get("name"), movieName));
        TypedQuery<Theatre> typedQuery = entityManager.createQuery(query
                .select(fromTheatres)
                .where(conditions.toArray(new Predicate[] {}))
                .orderBy(builder.asc(fromTheatres.get("id")))
                .distinct(true)
        );
        return typedQuery.getResultList();
    }
Thanks in advance