kotlin CoroutineCrudRepository的分页

mi7gmzs6  于 2023-01-26  发布在  Kotlin
关注(0)|答案(1)|浏览(116)

我在SpringBoot项目中使用了kotlin协程,并使用Spring Data 访问MongoDB。
例如,对于findAll(),一切都很正常,但是当我使用分页时,Spring在启动时抛出异常

IllegalStateException: Method has to use a either 
multi-item reactive wrapper return type or a wrapped Page/Slice type.

我的代码如下:

@Repository
interface CoroutinesActivityRepository : CoroutineCrudRepository<Activity, String> {
    suspend fun findAllOrderByTitle(page: Pageable): Flow<Activity>
}

data class Activity(val id: String? = null, val title: String)

可以对CoroutineCrudRepository应用分页吗?对我来说唯一有效的方法是使用ReactiveMongoTemplate

@Component
class CoroutinesActivityRepository(
   private val mongoTemplate: ReactiveMongoTemplate
) {
    suspend fun findAllOrderByTitle(page: Pageable): Flow<Activity> =
        mongoTemplate.find(Query().with(page), Activity::class.java).asFlow()
}
kognpnkq

kognpnkq1#

我知道现在很晚了,但是为了以后的参考...
尝试相同的操作,但删除suspend
fun findAllOrderByTitle(page: Pageable): Flow<Activity>
如果这解决了错误,但是分页不能正常工作,你可以使用@Query。同样,不要使用suspend
要使用@Query手动实现分页,可以使用LIMITOFFSET。例如:

@Query("""

        select * from table limit :size offset :offset

    """)
    fun findAll(offset: Int, size: Int): Flow<DataClass>

要从pagesize变量计算offset

val offset = size * (page - 1)

希望这能有所帮助!

相关问题