如何在谓词中使用 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)
)
);
}
它现在查找 completedOn
或 refundedAt
日期在 from
之后的票证。我想改变这个。
我现在想要的是:
如果工单的 refundedAt
不是 而不是 null
,则获取日期在 from
之后的 refundedAt
,否则获取日期 completedOn
在 from
.
之后
我尝试使用 builder.selectCase()
,也与 criteria.multiSelect()
结合使用,但没有用。
我希望有人能帮助我。
编辑:
为了弄清楚目前的情况,这里是if/else-statement的解释:
IF refundedAt
不为空,仅当 refundedAt
在 from
.
之后才能获得门票
ELSE(refundedAt
为空)仅当 completedOn
在 from
.
之后才能获得门票
使用 and
和 or
:
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)
)
)
);
所以我这里有这段代码:
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)
)
);
}
它现在查找 completedOn
或 refundedAt
日期在 from
之后的票证。我想改变这个。
我现在想要的是:
如果工单的 refundedAt
不是 而不是 null
,则获取日期在 from
之后的 refundedAt
,否则获取日期 completedOn
在 from
.
我尝试使用 builder.selectCase()
,也与 criteria.multiSelect()
结合使用,但没有用。
我希望有人能帮助我。
编辑: 为了弄清楚目前的情况,这里是if/else-statement的解释:
IF refundedAt
不为空,仅当 refundedAt
在 from
.
ELSE(refundedAt
为空)仅当 completedOn
在 from
.
使用 and
和 or
:
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)
)
)
);