Spring jpa не возвращает правильную запись для findFirstById_OrderByCreationDate_Desc - PullRequest
0 голосов
/ 10 марта 2020

У меня очень глупая проблема в моих тестах. Я использую @DataJpaTest для запуска ряда простых тестов в простом хранилище. У меня есть объект с именем Event и интерфейс хранилища, который всегда должен возвращать последнюю запись.

Однако, независимо от того, что я делаю, я получаю первую запись.

@Entity
@Cacheable(false)
public class Event {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(optional = false)
    private Observed observed;

    private LocalDateTime creationDate;

    //Constructor that sets the observer and timestamp
    //getters and setters

}

Какой Я запрашиваю через JPA:

public interface EventRepository extends JpaRepository<Event, Long> {

    Event findFirstById_OrderByCreationDate_Desc(@Nonnull Long id);

}

Теперь я ожидаю, что этот код сделает следующее. Упорядочите события по дате их создания, которая содержит метку времени с точностью до миллисекунды, поместив последнюю на вершину, а затем верните только последнюю в качестве результата для события. Это, кажется, работает в реальном приложении. Но в тестах происходит следующее:

@Test
public void createAndFindLastEvent() {
    Event event1 = new Event(observer);
    eventRepository.save(event1);
    Event event2 = new Event(observer);
    eventRepository.save(event2);
    Event event3 = eventRepository.findFirstById_OrderByCreationDate_Desc(observer.getId());
}

В результате event3 содержит значения event1, хотя event2 имеет более позднюю метку времени. Это сводит меня с ума. Я попытался использовать saveAndFlush() при сохранении, flush() непосредственно в репозитории, и я поместил @Cacheable(false) в сам класс сущности, чтобы не происходило странных вещей. Я что-то пропустил? Разве это не должно работать так, как я ожидаю?

Самое странное в этом то, что findAll() возвращает оба события и что порядок AS C или DES C, похоже, ничего не меняет.

1 Ответ

1 голос
/ 10 марта 2020

Попробуйте изменить

Event findFirstById_OrderByCreationDate_Desc(@Nonnull Long id);

на

Event findFirstByObserved_IdOrderByCreationDateDesc(@Nonnull Long id);

Также должно работать без подчеркивания

Event findFirstByObservedIdOrderByCreationDateDesc(@Nonnull Long id);

см. Также: 4.4.3 , Выражения свойств и статья: SpringData: Обход свойств

Похоже, что в вашем запросе вы спрашиваете о Event '* Id. Подчеркивание, кажется, не является необходимым, поскольку не должно быть никакой двусмысленности: они были бы полезны, если бы вы имели, например, свойство observedId в Event. Использование подчеркивания, как в первом варианте (...Observed_Id...) решит эту потенциальную проблему.

Я проверил sql запросов , и использование подчеркивания не имеет значения.

...