JPQL - 基于最新元素实现条件逻辑

时间:2018-04-25 19:33:11

标签: jpa spring-data-jpa jpql

我是JPA和Spring数据的新手。我想在我的订购系统中使用以下逻辑实现一个函数:

  1. 如果在给定时间戳后没有订单,则返回1
  2. 否则返回最后一个订单' s counter + 1
  3. 我可以用Pure 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 :(得分:0)

我很好奇确切的用例是什么。如果您可以依赖于在作为参数提供的即时之后创建的订单的计数器增加的事实,您只需选择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
)