春数据JPA和规范 - 多对多

问题描述:

我有一个类似的问题与这一个:Spring Data Jpa and Specification - how to work with ManyToOne and ManyToMany relations?春数据JPA和规范 - 多对多

我有3个表:演员,电影和mactors(连接表为电影和演员)弹簧开机,休眠,jpamodelgen

@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; 
.... 

}

我想获得其中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 ... 
    }; 
} 

我不知道接下来会发生什么。

任何提示,将不胜感激。 谢谢

看来我的原始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; 
     } 
    }; 
} 

我没条款去上班,但我做了一个或循环...

欢迎提出任何提示:)