基于子实体属性的JPA查询

时间:2019-09-28 09:39:47

标签: java spring-boot jpa jql

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

  1. 查找屏幕是否存在,并给定MultiPlexId屏幕名称。 (假设ID为1的倍数具有4个屏幕,即Audi-1,Audi-2,Audi-3和Audi-4,则查询应该能够找到ID为1的Multiplex中是否存在Audi-2)

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

我非常确定我需要使用联接,但是我在广告周围搜索无法弄清楚。 非常感谢您的帮助。

1 个答案:

答案 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,则使用最后一个可以获取异常