JPQL - реализовать условную логику на основе самого последнего элемента - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в данных JPA и Spring. Я хотел бы реализовать функцию со следующей логикой в ​​моей системе заказов:

  1. Если нет заказа после заданной отметки времени, вернуть 1
  2. в противном случае вернуть счетчик последнего заказа + 1

Могу ли я реализовать такую ​​логику с помощью чистого JPQL?

Заказ сущности:

@Entity
public class Order {

    @Id
    @GeneratedValue
    private UUID id;

    private Integer counter;

    @CreationTimestamp
    private Timestamp creationTimestamp;

    ...

OrderRepository.java:

@Repository
public interface OrderRepository extends CrudRepository<Order, UUID> {

    // TODO what goes after else?
    @Query("select case when count(o) < 1 then 1 else ... from Order o where o.creationTimestamp > :timestamp order by o.creationTimestamp desc")
    Integer nextCounter(@Param("timestamp") Timestamp timestamp);

}

1 Ответ

0 голосов
/ 26 апреля 2018

Мне интересно, каков точный вариант использования.Если бы вы могли полагаться на то, что счетчики для заказов, созданных после момента, указанного в параметре, увеличиваются, вы можете просто выбрать NVL(MAX(o.counter), 0) + 1 или событие COUNT(o) + 1.Я понимаю, что это не так.

То, что вы хотите, может быть достигнуто с помощью подзапроса следующим образом:

SELECT NVL(MAX(o.counter), 0) + 1
FROM Order o
WHERE o.creationTimestamp = (
    SELECT MAX(o.creationTimestamp) 
    FROM Order o 
    WHERE o.creationTimestamp > :timestamp
)
...