如何解决SpringData JPA:使用实体集合作为参数进行查询
我有一个要在其上执行更新的实体的列表,我知道我可以使用String / Integer ..等列表作为参数来更新表,例如
@Query("update tableName i set i.isUpdated = true where i.id in :ids")
void markAsUpdated(@Param("ids") List<Integer> itemIds);
我试图避免将实体列表重复转换为ID列表,以便在DB中进行查询。我知道有deleteall
和deleteInBatch
条命令接受参数作为实体列表。
如何在JPA Query中执行此操作,我尝试了以下操作,但尚未成功。
@Modifying(flushAutomatically = true,clearautomatically = true)
@Query("update tableName i set i.updated = true where i in :items")
void markAsUpdated(@Param("items") List<Item> items)
解决方法
查询需要ID,它不知道如何处理实体。
您有多种选择:
- 只需将id传递给方法,客户端负责提取id。
- 传递实体并使用SpEL提取ID
- 如注释中所建议,请使用默认方法来提供这两个API并相互委托。
关于注释中出现的问题:您可以通过使相关实体实现类似于此接口的方法,将提取id的方法移动到单个方法中:
interface WithId {
Long getId();
}
或通过将lambda传递给该方法,对单个实体进行转换:
List<ID> extractIds(List<E> entities,Function<E,ID> extractor) {
// ...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。