Hibernate Spring数据Jpa和规格-许多
我有一个类似的问题: 我有3个表:actor、movie和mactors(电影和演员的连接表),带有springboot、hibernatejpamodelgenHibernate 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 {
@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循环
欢迎提供任何改进建议:)