【发布时间】:2021-05-15 08:46:12
【问题描述】:
所以我这里有这段代码:
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,否则获取日期在from 之后的completedOn。
我尝试使用builder.selectCase(),也与criteria.multiSelect() 结合使用,但没有成功。
我希望有人可以帮助我。
编辑: 为了说明目前的情况,下面解释一下 if/else 语句:
如果 refundedAt 不为空,仅当refundedAt 在from 之后才获得票证。
ELSE(refundedAt 为空)仅当 completedOn 位于 from 之后时才能获得票证。
【问题讨论】:
-
您可能正在寻找 Java 三元运算符 - tutorials.jenkov.com/java/ternary-operator.html
-
我尝试执行以下操作:
predicates.add(ticketRoot.get("refundedAt") == null ? builder.greaterThanOrEqualTo(order.get("completedOn"), from) : builder.greaterThanOrEqualTo(ticketRoot.get("refundedAt"), from) );它不会抛出错误,但创建的查询不正确。
标签: java jpa criteria predicate