[英]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.