簡體   English   中英

如果/ Case語句在JPA Criteria Builder中

[英]If/Case statement in JPA Criteria Builder

我想建立一個查詢,搜索不同的entites日期。 我的結構是:

  • 合同有日期(不可為空)
  • 員工有日期(不可為空)
  • 員工可能有合同ID(可空)

如果員工有合同我想要檢索合同日期。 如果員工沒有合同,那么我想退回員工日期。

到目前為止我的代碼是:

if (inputDate!= null) {
    ParameterExpression<Date> exp = criteriaBuilder.parameter(Date.class, "inputDate");
    criteria.add(criteriaBuilder.or(
        criteriaBuilder.isNull(employee.get("contract")),
        criteriaBuilder.lessThanOrEqualTo(employee.<Date>get("creationDate"), exp),   criteriaBuilder.lessThanOrEqualTo((employee.join("contract").<Date>get("fromDate")), exp) ));}

這似乎不起作用。 我似乎總是進入我不期望的isNull。

我很高興再看一下,但我想我的問題是這是否是正確的方法。 是嗎? 我在criteriaBuilder中也看到了一個selectCase,所以也許這可能是一個更好的解決方案。

任何指針都會受到極大的歡迎。

謝謝

這將是一個解決方案,不確定它是否有效,但我們將設法讓你的幫助:):

ParameterExpression<Date> inputDateExp = criteriaBuilder.parameter(Date.class, "inputDate");
Predicate employeeCreationDate = criteriaBuilder.lessThanOrEqualTo(
        employee.<Date>get("creationDate"), inputDateExp);
Predicate contractStartDate = criteriaBuilder.lessThanOrEqualTo(
        employee.join("contract").<Date>get("fromDate"), inputDateExp);

criteria.add(
        criteriaBuilder.selectCase().when(employee.get("contract").isNull(), employeeCreationDate).otherwise(contractStartDate));

我不明白為什么使用“inputDate”作為Expression而不是Date? 另外,我建議重命名criteria ,以ccriteriaBuildercb ,這樣可節省空間,我認為這是更舒適。

我想你想要做的是使用Case<Date> ,並且只使用Predicate作為Case#when第一個參數。 Case<Date>是一個Expression<Date> ,這是你想要傳遞給CriteriaQuery#multiselect

CriteriaQuery<Employee> query = criteriaBuilder.createQuery(Employee.class);
Root<Employee> employee = query.from(Employee.class);
query.multiselect
(
    criteriaBuilder.selectCase()
        .when(criteriaBuilder.isNull(employee.get("contract")), employee.get("creationDate"))
        .otherwise(employee.join("contract").get("fromDate"))
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM