基于子实体属性的 JPA 查询

我有 4 个实体 MultiPlex、Screen、Screening 和 Movie。我想写2个查询。

  1. 根据给定 MultiPlexId 的屏幕名称查找屏幕是否存在。(假设 id 1 的 Multiplex 有 4 个屏幕,Audi-1、Audi-2、Audi-3 和 Audi-4,查询应该能够找到 id 1 的 Multiplex 中是否存在 Audi-2)

  2. 查找在给定日期运行给定电影的所有多厅影院(放映有屏幕、电影和日期的参考)

我的实体

电影:-

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

}

对于我尝试的第一个查询


@Query("SELECT m FROM Multiplex m Where m.id = :mId and m.screens.name = :screenName")

    public Optional<Multiplex> findScreenByName(@Param("mId") long id, @Param("screenName") String name);


MMTTMM
浏览 193回答 1
1回答

慕娘9325324

m.screens不是一个Screen字段,而是List<Screen>.&nbsp;所以表达m.screens.name:=screenName是错误的。尝试这个1)@Query("select&nbsp;m&nbsp;from&nbsp;Multiplex&nbsp;m,&nbsp;Screen&nbsp;s&nbsp;where&nbsp;m.id=s.multiplex.id&nbsp;and&nbsp;m.id&nbsp;=:mId&nbsp;and&nbsp;s.name&nbsp;=:screenName") &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Optional<Multiplex>&nbsp;findByMultiplexIdAndScreenName(@Param("mId")&nbsp;long&nbsp;id,&nbsp;@Param("screenName")&nbsp;String&nbsp;name);2)@Query("select&nbsp;distinct&nbsp;m&nbsp;from&nbsp;Multiplex&nbsp;m,&nbsp;Screening&nbsp;s&nbsp;where&nbsp;m.id=s.screen.multiplex.id&nbsp;and&nbsp;s.movie=:movie&nbsp;and&nbsp;s.date&nbsp;=:date") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List<Multiplex>&nbsp;findAllByMovieAndDate(@Param("movie")&nbsp;Movie&nbsp;movie,&nbsp;@Param("date")&nbsp;LocalDate&nbsp;date);或者@Query("select&nbsp;distinct&nbsp;s.screen.multiplex&nbsp;from&nbsp;Screening&nbsp;s&nbsp;where&nbsp;s.movie=:movie&nbsp;and&nbsp;s.date&nbsp;=:date") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List<Multiplex>&nbsp;findAllByMovieAndDate(@Param("movie")&nbsp;Movie&nbsp;movie,&nbsp;@Param("date")&nbsp;LocalDate&nbsp;date);通过使用最后一个,如果决定将 FetchTypes 更改为 Lazy,您可能会遇到异常
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java