Hibernate Spring数据Jpa和规格-许多

Hibernate Spring数据Jpa和规格-许多,hibernate,jpa,spring-boot,spring-data-jpa,Hibernate,Jpa,Spring Boot,Spring Data Jpa,我有一个类似的问题: 我有3个表:actor、movie和mactors(电影和演员的连接表),带有springboot、hibernatejpamodelgen @Entity public class Actor { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; ... } @Entity public class Movie implements BaseId {

我有一个类似的问题:

我有3个表:actor、movie和mactors(电影和演员的连接表),带有springboot、hibernatejpamodelgen

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

我想拍两个或两个以上演员在一起的电影。类似于此查询:

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 ...
    };
}
从电影中选择*
加入mactors on movie.id=mactors.movie
其中mactors.actor=x和mactors.actor=y和。。。;
公共静态规范findMoviesByActors(列出参与者){
返回(根、criteriaQuery、criteriaBuilder)->{
...
返回。。。
};
}
我不知道接下来会发生什么

任何暗示都将不胜感激。
谢谢

看来我原来的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;
        }
    };
}
公共静态规范findByActorsId(列表actorIds){
返回新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder cb){
Join=root.Join(电影演员);
谓词actorIdPredicate=cb.disconction();
用于(长期援助:actorIds){
actorIdPredicate.getExpressions().add(cb.equal(join.get(Actor.id),aid));
}
表达式计数=cb.count(root.get(Movie.id));
CriteriaQuery q=(CriteriaQuery)query.distinct(true).groupBy(root.get(Movie.title))。
有(cb.greaterThanOrEqualTo(count,new Long(actorIds.size()));
返回谓词;
}
};
}
我没有设法进入子句工作,但我做了一个OR循环

欢迎提供任何改进建议:)