Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在谓词中使用if/else语句?_Java_Jpa_Criteria_Predicate - Fatal编程技术网

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
表达式
转换为
表达式
,那么你就可以转换为谓词了,非常感谢