FindBy пружины JPA заставляет поток зависать при передаче нулевого параметра - PullRequest
0 голосов
/ 26 июня 2019

У меня есть приложение Spring jpa с сущностью «Report» и «ReportRepository», которое расширяет CrudRepository.

В репозитории ReportRepository я реализовал метод поиска отчетов по его атрибуту «reportNode», например:

    @Data
    @Builder
    @EqualsAndHashCode(onlyExplicitlyIncluded = true)
    @Entity
    public class Report {
        @Id
        @GeneratedValue(strategy = AUTO)
        @EqualsAndHashCode.Include
        private Long id;
        private Long authorId;
        private Long verifyingObserverId;
        private LocalDateTime creationDate;
        private LocalDateTime verificationDate;
        private String title;
        @Lob
        @Column(length=2048)
        private String description;
        private boolean completed;
        private boolean verified;
        private String joinParameter;
        private String reportNode;
        @Lob
        @Column(length=3060)
        private String hl7;

        @OneToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "requested_procedure_id")
        private RequestedProcedure requestedProcedure;

        @OneToMany(mappedBy = "report",
                cascade = CascadeType.ALL,
                orphanRemoval = true)
        private List<ReportVersion> reportVersions;
    }
    public interface ReportRepository extends CrudRepository<Report, Long> {
        List<Report> findByReportNode(String reportNode);
    }

Когда я пытаюсь использовать этот метод, передавая ненулевой параметр, он работает нормально, возвращая список найденных отчетов, но, когда я передаю нулевой параметр, метод никогда не прекращает свое выполнение.

Для ясности, это работает:

    List<Report> pendingReports = reportRepository.findByReportNode("");

Но это никогда не вернется:

    List<Report> pendingReports = reportRepository.findByReportNode(null);

Он также не генерирует никаких исключений или ошибок.

Я хотел бы знать, почему это не удается, и как я могу найти все объекты в таблице, которые имеют нулевой параметр с пружиной jpa.

Заранее спасибо

EDIT:

Я пытался создать специальный метод для поиска нулевых значений, например:

reportRepository.findByReportNodeIsNull()

Но поведение такое же. Казнь зависает.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Я закончил тем, что нашел решение.Проблема заключалась в том, что у класса «Report» должен быть конструктор без аргументов для jpa для создания возвращаемых им объектов.Если вы используете lombok, как я, вам просто нужно добавить следующую аннотацию:

@NoArgsConstructor
public class Report {
...

При этом обе

List<Report> pendingReports = reportRepository.findByReportNode(null);

и

List<Report> pendingReports = reportRepository.findByReportNodeIsNull()

работаюткак и предполагалось.

В качестве последнего замечания я нахожу странным, что не возникает исключение, когда он пытается использовать конструктор и не находит его, поскольку это делает эту проблему действительно неясной.

0 голосов
/ 26 июня 2019

Если вы хотите искать отчеты с нулевым узлом, вы должны использовать:

List<Report> pendingReports = reportRepository.findByReportNodeIsNull();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...