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



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

@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.

可以做什么?

您使用的IS NOT EMPTY错误。'm'不是一个集合,它是表示内容中的单个元素的路径。邮件集合。您已经对该集合进行了内部连接,因此它必须有一个不必要的"not empty"条目。但请注意,您可能会通过* many关系加入,因此将为邮件集合中的每个'm'获得重复的内容。

也许你想要的更像"SELECT contents FROM Content contents where contents.mails IS NOT EMPTY AND contents.startDate <= :startDate"

最新更新