带有迭代的Spring数据findAllBy返回空数组

时间:2019-01-12 20:18:54

标签: java spring spring-boot spring-data spring-mongo

使用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属性执行相同操作时返回的那样?

1 个答案:

答案 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]