2016-11-07 19 views
0

這是我的模型類:如何通過JQL直接找到多對多的實體?

Film.java

@Entity 
public class Film { 

    private Integer id; 
    private String title; 
    private List<FilmActor> filmActors; 

    @OneToMany(mappedBy = "film") 
    public List<FilmActor> getFilmActors() { 
     return filmActors; 
    } 

    public void setFilmActors(List<FilmActor> filmActors) { 
     this.filmActors = filmActors; 
    } 
} 

Actor.java

@Entity 
public class Actor { 

    private Integer id; 
    private String firstname; 
    private String lastname; 

    private List<FilmActor> filmActors; 

    @OneToMany(mappedBy = "actor") 
    public List<FilmActor> getFilmActors() { 
     return filmActors; 
    } 

    public void setFilmActors(List<FilmActor> filmActors) { 
     this.filmActors = filmActors; 
    } 
} 

這是加入表實體:

@Entity 
@Table(name = "film_actor") 
public class FilmActor { 

    private FilmActorPK id; 

    private Film film; 
    private Actor actor; 
    private Timestamp lastUpdate; 

    @EmbeddedId 
    public FilmActorPK getId() { 
     return id; 
    } 

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

    @ManyToOne 
    @MapsId("film") 
    @JoinColumn(name = "film_id") 
    public Film getFilm() { 
     return film; 
    } 

    public void setFilm(Film film) { 
     this.film = film; 
    } 

    @ManyToOne 
    @MapsId("actor") 
    @JoinColumn(name = "actor_id") 
    public Actor getActor() { 
     return actor; 
    } 

    public void setActor(Actor actor) { 
     this.actor = actor; 
    } 

    @Column(name = "last_update") 
    public Timestamp getLastUpdate() { 
     return lastUpdate; 
    } 

    public void setLastUpdate(Timestamp lastUpdate) { 
     this.lastUpdate = lastUpdate; 
    } 
} 

和主鑰匙等級:

@Embeddable 
public class FilmActorPK implements Serializable { 

    private int actorId; 
    private int filmId; 

    @Column(name = "actor_id") 
    public int getActorId() { 
     return actorId; 
    } 

    public void setActorId(int actorId) { 
     this.actorId = actorId; 
    } 

    @Column(name = "film_id") 
    public int getFilmId() { 
     return filmId; 
    } 

    public void setFilmId(int filmId) { 
     this.filmId = filmId; 
    } 
} 

所以我想找到2個給定演員行爲的電影。這是我有:

@Override 
public Collection<Film> filmsActorsTogether(Actor a, Actor b) { 
    final List<Film> filmsOfActorA = filmsOfActor(a); 
    final List<Film> filmsOfActorB = filmsOfActor(b); 
    final Collection<Film> intersection = CollectionUtils.intersection(filmsOfActorA, filmsOfActorB); 
    return intersection; 
} 

@Override 
public List<Film> filmsOfActor(Actor actor) { 
    final EntityManager entityManager = persistenceUtil.getEntityManager(); 
    final Actor persistentActor = entityManager.find(Actor.class, actor.getId()); 
    final ArrayList<Film> films = new ArrayList<Film>(); 
    for (FilmActor filmActor : persistentActor.getFilmActors()) { 
     films.add(filmActor.getFilm()); 
    } 
    entityManager.close(); 
    return films; 
} 

有沒有辦法實現這個並不獲取的2名演員所有的電影,並使用在內存中過濾?如何使用JQL直接從數據庫獲取電影?

回答

1

也許有一些更優雅,但下面的查詢應該工作:

select f from Film f where 
    (select count(fa.id) from FilmActor fa 
      where fa.film = f 
      and (fa.actor = :actor1 or fa.actor = :actor2)) = 2 

旁註:你的PK類應該有一個正確的equals()和hashCode()方法

相關問題