我是JPA和春季数据的新手。我想在我的订购系统中实现具有以下逻辑的函数:
- 如果给定时间戳后没有订单,请返回1
- 否则返回最后订单的计数器 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);
}
我很好奇确切的用例是什么。如果您可以依靠以下事实:随着参数的增加,在提供的即时后创建的订单计数器,则可以选择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
)