[英]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
。
這是MEMBER
和IN
一個很好的解釋: https : //stackoverflow.com/a/9820394/784594 。 也看看這里: http : //www.objectdb.com/java/jpa/query/jpql/collection#NOT_MEMBER_OF_
但是,即使文檔說IN
根據作為參數傳遞的列表進行比較時使用了IN
關鍵字,如果傳遞實體列表而不是原始值列表,hibernate 的行為似乎也很奇怪。 我最近遇到了這個問題,並使用MEMBER
解決了這個問題。 我不確定這是一個休眠錯誤還是所有其他提供程序的行為方式相同。
在 ObjectDB 的文檔中,您可能會讀到它以相同的方式對待IN
和MEMBER
。 在我看來,如果 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.