У меня есть 4 объекта MultiPlex, Screen, Screening и Movie.Я хочу написать 2 запроса.
Найти, если экран существует, дать имя экрана с заданным MultiPlexId.(Предположим, что Multiples с идентификатором 1 имеет 4 экрана, Audi-1, Audi-2, Audi-3 и Audi-4, Query должен быть в состоянии определить, существует ли Audi-2 в Multiplex с идентификатором 1)
Найти все мультиплексы, запускающие заданный фильм в определенную дату (в скрининге есть ссылка на экран, фильм и дату)
Мои объекты
Фильм: -
@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);
, но выдает ошибку: -
Caused by: org.hibernate.QueryException: illegal attempt to dereference collection [multiplex0_.id.screens] with element property reference [id]
at org.hibernate.hql.internal.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:58)
at org.hibernate.hql.internal.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:629)
at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:242)
at org.hibernate.hql.internal.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:1045)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1290)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4706)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4174)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2138)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2066)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:815)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:609)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:271)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191)
... 77 common frames omitted
Я совершенно уверен, что мне нужно использовать объединения, но я искал вокруг объявления, не мог понять.Любая помощь очень ценится.