2017-05-28 16 views
0

は、私はこの1と同様の問題があります:休止状態-jpamodelgenを、スプリングブーツで(映画や俳優のためのテーブルを結合する)俳優、映画とmactors:Spring Data Jpa and Specification - how to work with ManyToOne and ManyToMany relations?春データJPAと仕様 - 多対多

を、私は3つのテーブルを持っています

@Entity 
public class Actor { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

... 
} 

@Entity 
public class Movie implements BaseId { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
.... 

}

Iは、2人の以上の俳優が一緒にされているそれらの映画を取得したいと思います。このクエリのようなもの:

select * from movie 
    join mactors on movie.id = mactors.movie 
    where mactors.actor = x and mactors.actor = y and ...; 

public static Specification<Movie> findMoviesByActors(List<Long> actors) { 
    return (root, criteriaQuery, criteriaBuilder) -> { 
     ... 
     return ... 
    }; 
} 

私は次の何かを持っていません。

ご了承ください。 ありがとう

答えて

0

私の元のSQLクエリが間違っていたようです。 アン作業SQLは次のようになります。

select distinct * from movie 
    join mactors on movie.id = mactors.movie_id 
    where mactors.actor_id in (x, y, z...) 
group by movie.title 
having count(movie.id) >= numberOfActors; 

コード怒鳴る作品:

public static Specification<Movie> findByActorsId(List<Long> actorIds) { 
    return new Specification<Movie>() { 
     @Override 
     public Predicate toPredicate(Root<Movie> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
      Join<Movie, Actor> join = root.join(Movie_.actors); 

      Predicate actorIdPredicate = cb.disjunction(); 
      for(Long aid : actorIds) { 
       actorIdPredicate.getExpressions().add(cb.equal(join.get(Actor_.id), aid)); 
      } 

      Expression<Long> count = cb.count(root.get(Movie_.id)); 
      CriteriaQuery<Movie> q = (CriteriaQuery<Movie>) query.distinct(true).groupBy(root.get(Movie_.title)). 
        having(cb.greaterThanOrEqualTo(count, new Long(actorIds.size())); 

      return actorIdPredicate; 
     } 
    }; 
} 

を私は仕事に句で取得することが出来なかったが、私はループ内でORをした...

改善のヒントは歓迎します:)