簡體   English   中英

JPQL 多對多 - in 子句

[英]JPQL many to many - in clause

您能幫我找出以下 JPQL 查詢有什么問題嗎? 它應該按類型過濾書籍。

查詢有額外的 OR 條件,由於更好的可讀性,我已將其刪除(無論是否存在其他條件,錯誤都是相同的)。

@Query("SELECT b FROM Book b WHERE " + 
        "b in (select distinct b1 FROM Book b1 inner join b1.genres genre where genre in :genres)")
List<Book> searchBooks(@Param("genres") List<Genre> genres);

以下是堆棧跟蹤:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: , near line 1, column 197 [select count(b) FROM *.domain.Book AS b WHERE b.id = (select distinct b1.id FROM *.domain.Book b1 inner join b1.genres genre where genre in :genres_0_, :genres_1_)]

Book 和 Genre 類之間的關系是多對多無方向的。

    @ManyToMany
    @JoinTable(name = "books_genres",
                 joinColumns = @JoinColumn(name = "BOOK_ID"),
                 inverseJoinColumns = @JoinColumn(name = "GENRE_ID"))
    private List<Genre> genres;

我已經單獨檢查了子查詢並且它有效:

@Query("select distinct b1 FROM Book b1 inner join b1.genres genre where genre in :genres")
    List<Book> searchBooksByGenre(@Param("genres") List<Genre> genres);

是否有可能以這種方式使用子查詢?

您使用嵌套選擇的查詢是可以的,但是當您要在實體集合中進行搜索時,您必須使用MEMBER關鍵字而不是IN

這是MEMBERIN一個很好的解釋: https : //stackoverflow.com/a/9820394/784594 也看看這里: http : //www.objectdb.com/java/jpa/query/jpql/collection#NOT_MEMBER_OF_

但是,即使文檔說IN根據作為參數傳遞的列表進行比較時使用了IN關鍵字,如果傳遞實體列表而不是原始值列表,hibernate 的行為似乎也很奇怪。 我最近遇到了這個問題,使用MEMBER解決了這個問題 我不確定這是一個休眠錯誤還是所有其他提供程序的行為方式相同。

在 ObjectDB 的文檔中,您可能會讀到它以相同的方式對待INMEMBER 在我看來,如果 JPA 提供者應該有足夠的信息來解釋查詢,即使在這兩種情況下都使用了IN ,也沒有理由應該有 2 個關鍵字。

不幸的是,我對 memberOf 有進一步的問題,與數據格式有關,當傳遞流派列表並檢查它們是否存在於書籍流派列表中時,查詢將因數據格式異常而失敗。

@Query("SELECT b FROM Book b WHERE " +
        ":genres MEMBER OF b.genres")

with @Param("genres") List<Genre> genres

將導致以下情況(1 和 4 是傳遞給查詢的流派參數中流派對象的 ID):

Caused by: org.h2.jdbc.JdbcSQLException: Data conversion error converting "(1, 4)"; SQL statement:

我已經放棄了上述解決方案,並設法使用“子查詢”作為普通查詢來解決該問題,然后繼續向查詢添加條件。

所以最終的解決方案如下:

@Query("select distinct b1 FROM Book b1 inner join b1.genres genre where genre in :genres AND (---additional querys---)")

暫無
暫無

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

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