Spring data findAllBy с повторяемостью возвращает пустой массив - PullRequest
0 голосов
/ 12 января 2019

Использование ReactiveMongoRepository и пользовательского метода для возврата всех объектов с соответствующим свойством возвращает пустую коллекцию для чего-либо, кроме вызова 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, установленному в Video POJO.

Разве это не должно возвращать все Video объекты, которые имеют соответствующее пользовательское свойство hash, как это происходит, когда я делаю то же самое, но для свойства id?

1 Ответ

0 голосов
/ 12 января 2019
findAllByHashIn(Collection<Long> hashes);

Я никогда раньше не использовал Iterable в качестве параметра для пользовательского метода репозитория JPA, но я бы перевел имя findAllByHash как "взять единственное хеш-значение и найти все записи, имеющие это значение "и подпись будет findAllByHash(Long hash).

Ваша мотивация немного отличается: вы хотите, чтобы все хеши использовались во время поиска. Согласно этой таблице ,

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]
...