Hibernate复杂的数据检索?

时间:2015-08-13 07:58:02

标签: java mysql spring hibernate rest

我的数据库中有九个相关表。我必须在过滤用户请求后检索记录。

我的实体如下,

电影

@Entity
@Table(name = "movie")
public class Movie implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "movie_id")
    private int movieId;

    @Column(name = "category_id")
    private Integer categoryId;

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

    @Column(name = "movie_description", columnDefinition = "TEXT")
    private String movieDescription;

    @Column(name = "movie_summary", columnDefinition = "TEXT")
    private String movieSummary;

    private Integer status;

    @Column(name = "language_id")
    private Integer languageId;

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

    @Column(name = "imdb_rating")
    private Integer imdbRating;

    @Column(name = "rotten_tomatoes_rating")
    private Integer rottenTomatoesRating;

    @Column(name = "user_avg_rating")
    private Float userAvgRating;

    @Column(name = "main_genre_id")
    private Integer mainGenreId;

    @Column(name = "secondary_genre_id")
    private Integer secondaryGenreId;

    @Column(name = "created_by_user_id")
    private Integer createdByUserId;
}

分类

@Entity
@Table(name = "category")
public class FetchSubCategory implements Serializable {

    private static final long serialVersionUID = 1L;

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

    @Column(name = "category_name")
    private String categoryName;
}

MovieActorMapping

@Entity
@Table(name = "movie_actor_mapping")
public class MovieActorMapping implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "mapping_id")
    private int mappingId;

    @Column(name = "movie_id")
    private Integer movieId;

    @Column(name = "actor_id")
    private Integer actorId;
}

MovieActors

@Entity
@Table(name = "movie_actors")
public class MovieActors implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "actor_id")
    private int actorId;

    @Column(name = "actor_name")
    private String actorName;
}

MovieGenre

@Entity
@Table(name = "movie_genre")
public class MovieGenre implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "genre_id")
    private int genreId;

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

    @Column(name = "created_by_user_id")
    private Integer createdByUserId;
}

MovieLanguage

@Entity
@Table(name = "movie_language")
public class MovieLanguage implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "language_id")
    private int languageId;

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

    @Column(name = "created_by_user_id")
    private Integer createdByUserId;

    @Column(name = "last_updated_user_id")
    private Integer lastUpdatedUserId;
}

用户将请求如下.all是可选字段,

{
"subCategory":"New Release",
"language":"Malayalam",
"actor":"allu arjun",
"filmGenre":"'Family'"
}

根据请求,我将通过使用子查询检查相应表中的条件来返回movie列表。

方法

public List<Movie> getFilterMovieList(FilterMovieRequest filterMovieRequest) throws SQLException, ClassNotFoundException, IOException {

        List<Movie> movies = null;
        try {
            String subCategory = filterMovieRequest.getSubCategory();
            String language = filterMovieRequest.getLanguage();
            String actor = filterMovieRequest.getActor();
            String filmGenre = filterMovieRequest.getFilmGenre();

            String contained = "where";
            String sql = "from Movie as M ";

            if (actor.length() > 1) {
                sql += contained + " movieId in(select movieId from MovieActorMapping where actorId in(select actorId from MovieActors where actorName='" + actor + "')) ";

                contained = "and";
            }

            if (subCategory.length() > 1) {

                sql += contained + " M.categoryId=(select categoryId from FetchSubCategory where categoryName='" + subCategory + "') ";
                contained = "and";
            }

            if (language.length() > 1) {

                sql += contained + " M.languageId=(select languageId from MovieLanguage where languageName='" + language + "') ";
                contained = "and";
            }

            if (filmGenre.length() > 1) {

                sql += contained + " (M.mainGenreId in(select genreId from MovieGenre where genreName in(" + filmGenre + ")) or M.secondaryGenreId in(select genreId from MovieGenre where genreName in(" + filmGenre + ")))";
                contained = "and";
            }

            if (contained.equals("and")) {
                Session session = sessionFactory.getCurrentSession();
                Query query = session.createQuery(sql);
                movies = query.list();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return movies;

    }

它运作正常。问题是现在我必须结合影院电影播放的结果和播放时间。

我的影院相关表格如下,

theater_movie_mapping

enter image description here theater_list

enter image description here

show_timings

enter image description here

您可以在movie_id的{​​{1}}列中看到与我的基本表theater_movie_mapping相关的内容。使用它我们可以获取movietheater_id来获取影院并显示时间。注意我在检查上述条件后提前获取了一个电影列表。我如何组合来自 theater_list <的影院/ strong>并显示来自 show_timings 的时间?作为一个Android开发者,它对我来说似乎很复杂。完全被困了。任何帮助将不胜感激。使用show_id

现在我得到了以下格式的结果,

Spring restful webservice

我必须在每个json对象中添加剧院并显示时间,即每部电影..

1 个答案:

答案 0 :(得分:0)

假设theater_movie_mapping已映射到其中包含Class TheaterMovie的{​​{1}}

Movie movie

现在假设show_timings已映射到其中包含ArrayList<TheaterMovie> list = new ArrayList<TheaterMovie>(); for(int i = 0 ; i < movies.size() ; i++){ list.addAll((ArrayList<TheaterMovie>)createQuery("From TheaterMovie tm where tm.movies = :mo").setParameter("mo",movies.get(i)).getList()); } 的{​​{1}}

Class ShowTiming

我希望这对你有用