如何在谓词中使用 if/else-statement?

How can I use an if/else-statement within predicates?

所以我这里有这段代码:

final CriteriaBuilder builder = JPA.em().getCriteriaBuilder();
    final CriteriaQuery<Ticket> criteria = builder.createQuery(Ticket.class);
    Root<Ticket> ticketRoot = criteria.from(Ticket.class);
    Join<Ticket, Order> order = ticketRoot.join("order", JoinType.LEFT);
    Join<Ticket, EventGroup> eventGroups = ticketRoot.join("eventGroup", JoinType.LEFT);
    final List<javax.persistence.criteria.Predicate> predicates = new ArrayList<>();


if (from != null) {
    predicates.add(
        builder.or(
            builder.greaterThanOrEqualTo(order.get("completedOn"), from),
            builder.greaterThanOrEqualTo(ticketRoot.get("refundedAt"), from)
        )
    );
}

它现在查找 completedOnrefundedAt 日期在 from 之后的票证。我想改变这个。

我现在想要的是: 如果工单的 refundedAt 不是 而不是 null,则获取日期在 from 之后的 refundedAt,否则获取日期 completedOnfrom.

之后

我尝试使用 builder.selectCase(),也与 criteria.multiSelect() 结合使用,但没有用。

我希望有人能帮助我。

编辑: 为了弄清楚目前的情况,这里是if/else-statement的解释:

IF refundedAt 不为空,仅当 refundedAtfrom.

之后才能获得门票

ELSErefundedAt 为空)仅当 completedOnfrom.

之后才能获得门票

使用 andor :

predicates.add(
    builder.or(
        builder.and(    
            builder.isNotNull(ticketRoot.get("refundedAt")),        
            builder.greaterThanOrEqualTo(ticketRoot.get("refundedAt"), from)
        ),
        builder.and(            
            builder.isNull(ticketRoot.get("refundedAt")), 
            builder.greaterThanOrEqualTo(order.get("completedOn"), from)
        )
    )
);