gpt4 book ai didi

spring-data-jpa - 通过集合中的精确匹配查找实体

转载 作者:行者123 更新时间:2023-12-03 14:42:17 25 4
gpt4 key购买 nike

我有这样的实体:

@Getter
@Setter
@Entity
public class Conversation extends AbstractEntity{

@ElementCollection
@Column(name = "user_id", nullable = false)
@CollectionTable(name = "conversation_user", joinColumns = @JoinColumn(name = "conversation_id", nullable = false))
private List<String> usersIds;
}
是否可以通过用户 id 的精确匹配通过 spring 的存储库找到对话实体?例如我有这些实体:
 id | user_ids
------------------------------------------
1 | user-a, user-b, user-c
2 | user-a, user-b
3 | user-a, user-c
所以当我想要通过用户 ID 找到对话时 user-auser-c像这样的常规 IN 子句: SELECT c FROM Conversation c WHERE c.userIds IN :userIds会找到 id 1 和 3 的对话,但我想找到完全匹配的,所以我的预期结果只是对话 3。
可能的解决方案是在存储库中使用常规 IN 子句,在服务层中使用下一个过滤器集合,但我更喜欢直接从数据库返回所需实体的解决方案。至少可以在 JPQL 或 native sql 中使用吗?谢谢你。

最佳答案

使用 HAVINGCASE计数匹配 userId并检查是否与搜索到的 userIds 相等数数。

@Query(value = "SELECT c FROM Conversation c LEFT JOIN c.usersIds cu GROUP BY c "
+ "HAVING SUM(CASE WHEN cu IN (:userIds) THEN 1 ELSE -1 END) = :userIdsCount")
List<Conversation> findByUserIds(@Param("userIds") List<String> userIds,
@Param("userIdsCount") Integer userIdsCount);

关于spring-data-jpa - 通过集合中的精确匹配查找实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62488165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com