java - 运行 M :N query in hibernate? 的最佳方式

标签 java sql hibernate hql

试图弄清楚如何使用 hibernate 调用来获取给定类型的电影列表?!

我尝试获取给定的类型,然后使用 GenreDTO 的方法来获取电影集。

Query hqlQuery = session.createQuery("FROM GenreDTO WHERE genre like :genre");

GenreDTO g = hqlQuery.setParameter("title","%" + term + "%").uniqueResult();

return g.getMovies();

有更好的方法吗?

CREATE TABLE Movie (
    id INTEGER PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    title VARCHAR(255),
    poster VARCHAR(255),
    director VARCHAR(255),
    actors VARCHAR(255),
    synopsis VARCHAR(3000), 
    release_date TIMESTAMP
);

CREATE TABLE Genre(
    id INTEGER PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
    genre VARCHAR(255)
);

CREATE TABLE MovieHasGenre(
    movie_id INTEGER REFERENCES Movie (id) NOT NULL,
    genre_id INTEGER REFERENCES Genre (id) NOT NULL,
    PRIMARY KEY (movie_id, genre_id)
);

package edu.unsw.comp9321.jdbc;

import java.util.HashSet;
import java.util.Set;

public class GenreDTO {


    public GenreDTO() {}

    public GenreDTO(int id, String genre) {
        super();
        this.id = id;
        this.genre = genre;
    }

    private int id;
    private String genre;
    private Set<MovieDTO> movies = new HashSet<MovieDTO>();

    public int getId() {
        return id;  
    }

    public void setId(int id) {
        this.id = id;
    }
    public String getGenre() {
        return genre;
    }
    public void setGenre(String genre) {
        this.genre = genre;
    }

    public Set<MovieDTO> getMovies() {
        return movies;
    }
    public void setMovies(Set<MovieDTO> movies) {
        this.movies = movies;
    }
}


package edu.unsw.comp9321.jdbc;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.OneToMany;


public class MovieDTO implements Comparable {
    private int id;
    private String title;
    private String poster;
    private String director;
    private String actors;
    private String synopsis;
    private String release_date;
    private int cinema_id;
    private Set<GenreDTO> genres = new HashSet<GenreDTO>();
    private Set<ReviewDTO> reviews = new HashSet<ReviewDTO>();
    private double rating;

    public MovieDTO() {
    }

    public MovieDTO(int id, String title, String poster, String director,
            String actors, String synopsis, String release_date, double rating) {
        super();
        this.id = id;
        this.title = title;
        this.poster = poster;
        this.director = director;
        this.actors = actors;
        this.synopsis = synopsis;
        this.release_date = release_date;
        this.rating = rating;
    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }

    public String getPoster() {
        return poster;
    }
    public void setPoster(String poster) {
        this.poster = poster;
    }

    public String getDirector() {
        return director;
    }
    public void setDirector(String director) {
        this.director = director;
    }

    public String getActors() {
        return actors;
    }
    public void setActors(String actors) {
        this.actors = actors;
    }

    public String getSynopsis() {
        return synopsis;
    }
    public void setSynopsis(String synopsis) {
        this.synopsis = synopsis;
    }

    public String getRelease_date() {
        return release_date;
    }
    public void setRelease_date(String release_date) {
        this.release_date = release_date;
    }

    public Set<GenreDTO> getGenres() {
        return genres;
    }
    public void setGenres(Set<GenreDTO> genres) {
        this.genres = genres;
    }

    public Set<ReviewDTO> getReviews() {
        return reviews;
    }
    public void setReviews(Set<ReviewDTO> reviews) {
        this.reviews = reviews;
    }

    public int getCinema_id() {
        return cinema_id;
    }
    public void setCinema_id(int cinema_id) {
        this.cinema_id = cinema_id;
    }

    public double getRating() {
        return rating;
    }
    public void setRating(double rating) {
        this.rating = rating;
    }

    @Override
    public int compareTo(Object o) {
        MovieDTO other = (MovieDTO) o;
        if (this.rating > other.rating) return -1;
        if (this.rating < other.rating) return 1;
        return 0;
    }
}

最佳答案

是的。有一个更好的办法。只需使用连接即可:

select m from Movie m join m.genres g where g.genre like :genre

select m from Genre g join g.movies m where g.genre like :genre

请注意,使用 like 子句有点奇怪。您应该使用流派的 ID 来唯一标识它。如果您只有某个流派名称的一部分,则不应假设只有一种流派包含该流派部分。

此外,DTO 不是实体,反之亦然。不要将实体命名为 GenreDTO 或 MovieDTO。将其命名为“类型”或“电影”。

关于java - 运行 M :N query in hibernate? 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26203990/

相关文章:

java - Spring Maven、MySQL、Hibernate、GlassFish : javax. persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey

java - TreeMap 带有比较器比较键中字符串的长度

java - 为什么 Javascript(在 Rhino 中运行)无法访问 java.lang.reflect.Method 实例上的方法?

c# - 日期时间方程不返回任何值。服务器 2008

python - 1064, "You have an error in your SQL syntax"插入(另一个)

hibernate - 如何动态更改 Spring Boot 实体中的架构?

java - 多级层次结构的 Hibernate 混合继承策略

java - AWS ElasticSearch 2.3 Java HTTP 批量 API

java - 如果我没有告诉它,为什么我的代码会显示提示两次?

android - Android:如何将单个表字段的值设置为String变量?