Java 如何在谓词中使用if/else语句?
我这里有一段代码:Java 如何在谓词中使用if/else语句?,java,jpa,criteria,predicate,Java,Jpa,Criteria,Predicate,我这里有一段代码: final CriteriaBuilder builder = JPA.em().getCriteriaBuilder(); final CriteriaQuery<Ticket> criteria = builder.createQuery(Ticket.class); Root<Ticket> ticketRoot = criteria.from(Ticket.class); Join<Ticket, Order>
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)
)
);
}
final CriteriaBuilder=JPA.em().getCriteriaBuilder();
最终条件查询条件=builder.createQuery(Ticket.class);
根ticketrout=标准.from(Ticket.class);
连接顺序=ticketrot.Join(“顺序”,JoinType.LEFT);
Join eventGroups=ticketrot.Join(“eventGroup”,JoinType.LEFT);
最终列表谓词=new ArrayList();
if(from!=null){
谓词.add(
建筑商(
建造商greaterThanOrEqualTo(订单获取(“完成”),发件人,
建筑商:greaterThanOrEqualTo(ticketRoot.get(“退款”),来源:
)
);
}
现在,它将从中查找日期在之后且在上已完成的或已退款的车票。我想改变这个
我现在想要的是:
如果车票的退款日期
不为空
,则从获取日期在之后的退款日期,否则从
获取日期在之后的完成日期
我尝试使用builder.selectCase()
,也与criteria.multiSelect()
结合使用,但没有成功
我希望有人能帮助我
编辑:
为明确当前情况,以下是解释的if/else声明:
如果退款
不为空,则仅当
退款
在
的之后时,才可获得车票
ELSE(
returnedat
为空)仅当completedOn
在from
之后,使用和和或获取车票:
predicates.add(
建筑商(
及(
builder.isNotNull(ticketRoot.get(“returnedat”),
建筑商:greaterThanOrEqualTo(ticketRoot.get(“退款”),来源:
),
及(
builder.isNull(ticketRoot.get(“returnedat”)),
builder.greaterThanOrEqualTo(order.get(“completedOn”),from)
)
)
);
您可能正在寻找Java三元运算符-我尝试了以下操作:谓词.add(ticketrot.get(“returnedat”)==null?builder.greaterThanOrEqualTo(order.get(“completedOn”),from):builder.greaterThanOrEqualTo(ticketrot.get(“returnedat”),from)代码>它不会抛出错误,但创建的查询不正确。问题是这不起作用。谓词
所需的类型是谓词
。selectCase()
返回一个表达式
@TBatist,因为大于或等于返回一个谓词,否则的返回值可以是作为谓词的表达式
。不确定,但如果您添加casting(谓词)builder,它可能会工作。selectCase()
是的,我也这么认为,但它给出了一个错误;不可变类型。所以我不能转换它。@t如果我已经更新了答案->你需要使用as
将表达式
转换为表达式
,那么你就可以转换为谓词了,非常感谢