使用ReactiveMongoRepository
和自定义方法返回具有match属性的所有对象将返回除findAllById
调用之外的任何内容的空集合。
我想知道我是否只是误解了某些内容,而这仅适用于ID字段或其他内容?
我正在使用的界面:
@Repository
public interface VideoRepository extends ReactiveMongoRepository<Video, String> {
Flux<Video> findAllByHash(Iterable<Long> hash);
}
我只是通过以下方式致电
@GetMapping("duplicates")
public Flux<Video> duplicates() {
// {...}
List<Long> hashList = duplicateDTOs
.stream()
.map(duplicateDTO -> Long.valueOf(duplicateDTO.getHash()))
.collect(Collectors.toList());
return videoRepository.findAllByHash(hashList);
}
作为参考,有问题的POJO:
@Data
@Builder
@Document
@AllArgsConstructor
@NoArgsConstructor
public class Video {
@Id
String id;
long hash;
//{...}
}
我已确认我在hashList
中传递了三个值,它们与hash
POJO上设置的自定义Video
属性相匹配。
这是否不返回所有具有匹配的自定义Video
属性的hash
对象,就像我为id
属性执行相同操作时返回的那样?
答案 0 :(得分:2)
findAllByHashIn(Collection<Long> hashes);
我以前从未使用过Iterable
作为自定义JPA存储库方法的参数,但是我将findAllByHash
的名称翻译为“采用单个哈希值”并找到所有具有该值的条目”,签名将为findAllByHash(Long hash)
。
您的动机有点不同:您希望在搜索过程中使用所有散列。根据{{3}},
Keyword | Sample | JPQL snippet
In | findByAgeIn(Collection<Age> ages) | … where x.age in ?1
Spring JPA支持逻辑IN
并接受Collection
的子类,因此它可能是
findAllByHashIn(Collection<Long> hashes);
findAllByHashIn(List<Long> hashes);
更新
出于好奇,我写了自己的Iterable
,而不是Collection
来看到该方法失败。不出所料,春天就扔了
IllegalArgumentException:参数值XXX与预期的类型[java.lang.Long(n / a)]不匹配。
尽管期望使用Long
参数,但它可以与Collection
(我使用Arrays.asList(1L, 2L)
)一起很好地运行,但是执行一个愚蠢的SQL查询:
... from XXX XXX0_ where XXX0_.hash=(? , ?)
binding parameter [1] as [BIGINT] - [1]
binding parameter [2] as [BIGINT] - [2]
使用findAllByHashIn
,添加了IN
,查询看起来不错:
... from XXX XXX0_ where XXX.hash in (? , ?)
binding parameter [1] as [BIGINT] - [1]
binding parameter [2] as [BIGINT] - [2]