我有4个实体MultiPlex,Screen,Screening和Movie。我想写两个查询。
查找屏幕是否存在,并给定MultiPlexId屏幕名称。 (假设ID为1的倍数具有4个屏幕,即Audi-1,Audi-2,Audi-3和Audi-4,则查询应该能够找到ID为1的Multiplex中是否存在Audi-2)
查找在给定日期播放给定电影的所有多路复用(放映具有屏幕,电影和日期的引用)
我的实体
电影:-
\;
Multiplex:-
xargs
屏幕:-
@Entity
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String title;
private double rating;
}
筛选:-
@Entity
public class Multiplex {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToMany(mappedBy = "multiplex", cascade = CascadeType.ALL)
private List<Screen> screens;
}
对于我尝试的第一个查询
@Entity
public class Screen {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@ManyToOne
private Multiplex multiplex;
}
但给我错误:-
@Entity
public class Screening {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToOne
private Screen screen;
@OneToOne
private Movie movie;
private LocalDate date;
private LocalTime time;
private float pricePerSeat;
}
我非常确定我需要使用联接,但是我在广告周围搜索无法弄清楚。 非常感谢您的帮助。
答案 0 :(得分:2)
m.screens
不是Screen
字段,而是List<Screen>
。因此,表达式m.screens.name:=screenName
是错误的。
尝试一下
1)
@Query("select m from Multiplex m, Screen s where m.id=s.multiplex.id and m.id =:mId and s.name =:screenName")
public Optional<Multiplex> findByMultiplexIdAndScreenName(@Param("mId") long id, @Param("screenName") String name);
2)
@Query("select distinct m from Multiplex m, Screening s where m.id=s.screen.multiplex.id and s.movie=:movie and s.date =:date")
public List<Multiplex> findAllByMovieAndDate(@Param("movie") Movie movie, @Param("date") LocalDate date);
或
@Query("select distinct s.screen.multiplex from Screening s where s.movie=:movie and s.date =:date")
public List<Multiplex> findAllByMovieAndDate(@Param("movie") Movie movie, @Param("date") LocalDate date);
如果决定将FetchTypes更改为Lazy,则使用最后一个可以获取异常