我有一个具有以下查询方法的存储库
@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"