我正在 Kotlin 中开发 Spring Boot REST API。底层数据库是 Postgresql,我正在使用 Spring Data JPA 进行数据库访问。
我有一个名为“用户”的表,其中有一些用户数据。用户属性之一是“性别”。它可以具有以下两个值之一:MALE 或 FEMALE。
我想在我的应用程序中有一个功能来找到我以前从未见过的特定性别的人的随机数(例如 20)。我的意思是 - 假设我有一个表,我在其中存储我已经看到的用户的 ID。
所以现在,我想做的基本上是从 Users 表中获取 20 个随机用户,其中性别为 MALE 并且 id 不在 [我看到的 ids 列表] 中。
查询的随机性最初让我创建了一个原生查询:
SELECT * FROM users WHERE gender = :gender ORDER BY random() LIMIT :number
但是,我意识到这可能非常低效,因为该order by random()部分将对整个表格进行排序(如果我选择一种性别,则为表格的一半)。
所以我的第二个想法是处理代码中的随机性。所以我决定调用 db 来计算用户数量(以获取最高的 id),然后生成一些 id 值,范围从 0 到最高,过滤掉我看到的那些,然后从中获取用户数据库 ID:
val numberOfUsersInDatabase = userRepository.count()
val idsOfUsersVotedForBefore = voteService.findIdsOfUsersVotedFor(requestingUser.id!!) val excludedIds = idsOfUsersVotedForBefore.plus(requestingUser.id) val idsToFetch = random.longs(2*amountOfIds, 1L, numberOfUsersInDatabase)
.boxed()
.filter { num -> !excludedIds.contains(num) }
.limit(amountOfIds)
.collect(toSet()) val randomUsers = userRepository.findUsersByIds(idsToFetch)但在这种情况下,我无法知道随机选择的用户的性别是什么,所以我不可能在进行数据库调用之前按性别过滤结果。
你能建议如何更好地解决这个问题吗?
收到一只叮咚
白衣染霜花
江户川乱折腾
肥皂起泡泡
相关分类