簡體   English   中英

JPA 基於子實體屬性的查詢

[英]JPA Query based on child Entitiy properties

我有 4 個實體 MultiPlex、Screen、Screening 和 Movie。 我想寫2個查詢。

  1. 查找屏幕是否存在給定 MultiPlexId 的屏幕名稱。 (假設一個 id 為 1 的 Multiplex 有 4 個屏幕,Audi-1、Audi-2、Audi-3 和 Audi-4,查詢應該能找到 Audi-2 是否存在於 id 為 1 的 Multiplex 中)

  2. 查找在給定日期運行給定電影的所有 Multiplex(篩選有屏幕、電影和日期的參考)

我的實體

電影:-

@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

我很確定我需要使用連接,但我搜索了廣告無法弄清楚。 任何幫助深表感謝。

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,您可以獲得異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM