繁体   English   中英

Spring Data Jpa和规范-ManyToMany

[英]Spring Data Jpa and Specification - ManyToMany

我对此有一个类似的问题: Spring Data Jpa和Specification-如何使用ManyToOne和ManyToMany关系?

我有3个表:带弹簧靴的演员,电影和演员(电影和演员的联接表),hibernate-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;
....

}

我想看那些有两个或更多演员在一起的电影。 类似于以下查询:

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

我没有设法使in子句起作用,但是我在循环中执行了OR操作...

欢迎任何改进的技巧:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM