2014-09-30 118 views
-1

我有一个oneToMany电影和演员表之间的关联和ManyToOne协会相反的方式。没有返回正确的结果?

我想获得给定演员的电影名称。在SQL,该查询将是

SELECT m.name from Movie m INNER JOIN Actor a on a.movie_id=m.movie_id AND a.name='BRAD' 

JPQL工作,相同的查询将被写为

SELECT m.name from Movie m INNER JOIN m.actors act where act.name='BRAD' 

此查询是比上述的纯SQL不同。

我希望,因为每个电影对象来执行这样的事情有演员

SELECT m.name from Movie m, m.actors act where BRAD' EXISTS act.names 

上面的查询语法是错误的集合。但它传达了我想要选择的内容。如何在不使用JOIN的情况下实现此查询,并且如果可能的话,无需使用子查询。

其实,我尝试了下面的子查询的版本,并没有工作,要么:

select m.name from Movie m Where EXISTS (SELECT act.movie FROM Actor act where act.name='Brad') 

上述查询将返回所有的电影行

这里有我的实​​体的相关部分:

@Entity 
public class Movie { 

    @Id 
    @Column(name="MOVIE_ID") 
    @GeneratedValue 
    private Long id; 

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

    @Column(name="Date_Released") 
    private Date date; 

    @OneToMany(mappedBy="movie",fetch=FetchType.EAGER,cascade=CascadeType.ALL) 
    private Set<Actor> actors=new HashSet<>(); 

    public Movie(){} 

    public Movie(String name, Date released){ 
     this.name=name; 
     this.date=released; 
    } 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 

    public Set<Actor> getActors() { 
     return actors; 
    } 

    public void setActors(Set<Actor> actors) { 
     this.actors = actors; 
    } 

    public String toString(){ 
     return id + " : " + name + " : " + date; 
    } 

    public void addActor(Actor a){ 
     getActors().add(a); 
    } 
} 

    @Entity 
public class Actor { 
    @Id 
    @Column(name="ACTOR_ID") 
    @GeneratedValue 
    private Long id; 

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

    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="ACTOR_MOVIE") 
    private Movie movie; 


    public Actor(){} 

    public Actor(String name){ 
     this.name=name; 
    } 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public Movie getMovie() { 
     return movie; 
    } 

    public void setMovie(Movie movie) { 
     this.movie = movie; 
    } 

    public String toString(){ 
     return name + " : " + movie.getName(); 
    } 

} 

测试类在这里:

public class HibernateTest { 

    public static void main(String[] args) { 

Movie movie1 = new Movie("Mr and Mrs.Smith", new Date(2005, 6, 5)); 
    Actor actor3=new Actor("Brad"); 
    actor3.setMovie(movie1); 
    Actor actor4=new Actor("Joe"); 
    actor4.setMovie(movie1); 
    movie1.getActors().add(actor3); 
    movie1.getActors().add(actor4); 

    Movie movie = new Movie("Titanic", new Date(1997,12,19)); 
    Actor actor1=new Actor("Leo"); 
    Actor actor2=new Actor("Kate"); 
    actor1.setMovie(movie); 
    actor2.setMovie(movie); 
    movie.getActors().add(actor1); 
    movie.getActors().add(actor2); 


    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.persist(movie); 
    session.persist(movie1); 
    session.getTransaction().commit(); 
    session.close(); 

    session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    List<String> bradMovies=session.createQuery("select m.name from Movie m, IN (m.actors)actors" 
      + " Where actors.name='BRAD'").list(); 
    System.out.println("bradMovies = "+ actorsFromMovies); 
    session.getTransaction().commit(); 
    session.close(); 

} }

EDIT

我编辑上面的代码以包括整个代码。之前它只有片段。

回答

0

这里是没有任何连接和子查询一个HQL查询:

Query q2 = session.createQuery("SELECT m FROM Movie m, IN (m.actors)actors 
WHERE actors.name = 'Brad'"); 

而且下面的查询在你的问题的作品,但我不明白为什么你不想使用它。

SELECT m.name from Movie m INNER JOIN m.actors act where act.name='BRAD' 
+0

你上面的第一个解决方案是返回空列表。我是100%,因为我刚刚插入,所以有匹配的条目。顺便说一句,我不想​​使用连接,如果它不需要。连接会导致更多性能问题。 – 2014-10-01 18:09:41

+0

@brainstorm,我已经在我的机器上测试过它,它的工作原理,所以我猜想我的使用和你正在使用的是有区别的。你可以添加更多关于你的映射在数据库中的实体和样本数据之间的映射方式,以及hibernate为我的第一个HQL生成的查询的详细信息,这样我可以看到差异在哪里。你也说过你不想使用JOIN或子查询,所以你期待什么样的查询,因为需要JOIN或Subquery来获得你的输出。 – Chaitanya 2014-10-02 13:20:11

+0

请参阅上面的代码中的编辑。我粘贴了整个代码。 – 2014-10-02 18:15:10

相关问题