jpa 在多对多关系中,带连接的Spring IS NOT EMPTY查询失败

wljmcqd8  于 2023-01-21  发布在  Spring
关注(0)|答案(1)|浏览(262)

我有一个具有以下查询方法的存储库

@Query("SELECT contents FROM Content contents JOIN contents.mails m WHERE m IS NOT EMPTY AND contents.startDate <= :startDate")
Set<Content> findAllByCreateDateIsBeforeAndMailRecipientsIsNotEmpty(@Param("startDate") Instant startDate);

问题是在我从Spring 2.7.5更新到3.0.1之后,出现了以下错误,并且Spring应用程序无法启动。

Error interpreting query 
[SELECT contents FROM Content contents JOIN contents.mails m WHERE m IS NOT EMPTY AND contents.startDate <= :startDate]; 
this may indicate a semantic (user query) problem or a bug in the parser 
[SELECT contents FROM Content contents JOIN contents.mails m WHERE m IS NOT EMPTY AND contents.startDate <= :startDate]

class org.hibernate.query.sqm.tree.domain.SqmSetJoin 
cannot be cast to class 
org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath 
(org.hibernate.query.sqm.tree.domain.SqmSetJoin and 
org.hibernate.query.sqm.tree.domain.SqmPluralValuedSimplePath 
are in unnamed module of loader 'app')

在我从WHERE STATEMENT中删除m IS NOT EMPTY后,应用程序启动并正常工作,但查询并不像它预期的那样。
注意:内容和邮件是Spring中定义的经典的多对多关系,数据库是Oracle v.19。
可以做些什么呢?

8hhllhi2

8hhllhi21#

您使用IS NOT EMPTY时出错。“m”不是集合,它是表示contents.mails集合中单个元素的路径。您已对该集合进行了内部联接,因此它必须有一个条目,这样就没有必要使用“is not empty”。但请注意,您很可能是跨 *ToMany关系进行联接,因此邮件集合中的每个“m”都将获得重复的内容。
也许你想要的更像是"SELECT contents FROM Content contents where contents.mails IS NOT EMPTY AND contents.startDate <= :startDate"

相关问题