如何解决如何在 R2dbcRepository
我正在使用 R2dbcRepository
并且我认为它不支持本机查询。 @Query(nativeQuery
出现错误。
如果不使用本机,我似乎无法找到查询的解决方案,因为我有 join
表、subselect
查询和 Pageable
。
我无法从注册中获取所有结果并将其过滤掉,因为我有 Pageable
(除非它可以在 flatMaps 中实现?)
有人知道如何将这个查询变成响应式的吗?
这是我的查询:
import org.springframework.data.r2dbc.repository.Query;
@Query(nativeQuery = true,value =
"select R.ID,R.REGISTRATION_DATE,R.NAME,U.FULL_NAME,R.STATUS,R.LAST_MODIFIED_DATE,"
+ " (SELECT ASSESSOR.FULL_NAME FROM JHI_USER ASSESSOR WHERE ASSESSOR.USERNAME = R.LAST_MODIFIED_BY) AS LAST_MODIFIED_BY "
+ " FROM REGISTRATION R "
+ " INNER JOIN JHI_USER U ON R.ID = U.REGISTRATION_ID "
+ " WHERE U.SUBMITTED_REGISTRATION = TRUE "
+ " AND LOWER(U.FULL_NAME) LIKE like concat('%',LOWER(:fullName),'%') "
+ " order by :sortColumn :sortDirection limit :pageSize offset :pageNumber")
List<Object[]> findAllByAppUsers(@Param(value = "fullName") String fullName,@Param(value = "sortColumn") String sortColumn,@Param(value = "sortDirection") String sortDirection,@Param(value = "pageSize") int pageSize,@Param(value = "pageNumber") int pageNumber);
(1) 如果我删除
@Query(nativeQuery=true)
并使用@Query("select...")
并返回一个Flux<Object[]> findAllByAppUsers(...)
nested exception is io.r2dbc.spi.R2dbcBadGrammarException: [42000] [42000] Syntax error in SQL statement "SELECT R.ID,U. FULL_NAME AS FULL_NAME,(SELECT ASSESSOR.FULL_NAME FROM JHI_USER ASSESSOR WHERE ASSESSOR.USERNAME = R.LAST_MODIFIED_BY) AS LAST_MODIFIED_BY FROM REGISTRATION R INNER JOIN JHI_USER U ON R.ID = U.REGISTRATION_ID WHERE U.SUBMITTED_REGISTRATION = TRUE ORDER BY $1 $[*]2 LIMIT $3 OFFSET $4";
(2) 如果我删除参数,我得到这个错误:
org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.Object
(3) 如果我做
@Query("select new com.my.dto.RegistrationDTO () ...")
nested exception is io.r2dbc.spi.R2dbcBadGrammarException: [42000] [42000] Syntax error in SQL statement "SELECT NEW COM.[*]MY.DTO.REGISTRATIONDTO (R.ID,U.FULL_NAME AS FULL_NAME,(SELECT ASSESSOR.FULL_NAME FROM JHI_USER ASSESSOR WHERE ASSESSOR.USERNAME = R.LAST_MODIFIED_BY) AS LAST_MODIFIED_BY) FROM REGISTRATION R INNER JOIN JHI_USER U ON R.ID = U.REGISTRATION_ID WHERE U.SUBMITTED_REGISTRATION = TRUE";
SQL 在 postgreSQL 中运行良好:
SELECT R.ID,(SELECT ASSESSOR.FULL_NAME FROM JHI_USER ASSESSOR WHERE ASSESSOR.USERNAME = R.LAST_MODIFIED_BY) as LAST_MODIFIED_BY
FROM REGISTRATION R
INNER JOIN JHI_USER U ON R.ID = U.REGISTRATION_ID
WHERE U.SUBMITTED_REGISTRATION = true
AND LOWER(U.FULL_NAME) LIKE LOWER('%test%')
ORDER BY full_name,last_modified_by ASC LIMIT 10 offset 0
解决方法
根据Query
注解的Javadoc:
提供将用于执行方法的 SQL 语句的注释。
一个 Query
包装了一个 SQL 语句,而不是像 HQL/JPQL 这样的其他语言。我认为 R2dbcRepository
尚不支持任何“非本地”查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。