2017-09-15 10 views
0

기준 API를 사용하여 로그인 한 사용자의 현재 날짜 (자신의 시간대에 따라)와 테이블 열을 비교하려고합니다.Java에서 Criteria Builder API를 사용하는 날짜 비교

하지만 사용자에 대해 계산 한 현지 날짜 중 표현을 가져올 수 없습니다. 이 문제를 어떻게 해결할 수 있습니까?

public void checkTaskCategory(TaskCriteria criteria, CriteriaBuilder cb, CriteriaQuery<Task> q, Root<Task> task, List<Predicate> predicates) { 
    if (StringUtils.isNotBlank(criteria.getCategory())) { 
    LocalDate currentDateForUserTimezone = LocalDateTime.now(ZoneId.of("Pacific/Pago_Pago")).toLocalDate(); 
     if (StringUtils.equalsIgnoreCase(TaskConstants.TASK_OVERDUE, criteria.getCategory())) { 
      predicates.add(cb.greaterThan(cb.currentDate(), task.<Date>get(TaskConstants.DUE_DATE))); 
      predicates.add(cb.notEqual(task.get("status"), getStatus(Status.Value.DONE.toString()).getId())); 
      q.orderBy(cb.asc(task.get(TaskConstants.DUE_DATE))); 
     } 
    } 
} 

내가 함께 cb.currentDate()를 교체하려면 내 계정으로 시간대를 고려하지 않습니다 cb.currentDate 이후 비교를 위해 currentDateForUserTimezone을 계산. 그것을 어떻게 성취 할 수 있습니까?

+0

@lonut 알고 계십니까? –

+0

질문과 관련이 없지만'LocalDate.now (ZoneId.of ("Pacific/Pago_Pago"))'를 사용할 수 있습니다. LocalDateTime.now (ZoneId.of ("Pacific/Pago_Pago"))와 동일하지만 (보다 짧습니다.) toLocalDate()' –

+0

@ Hugo .. 감사합니다. –

답변

0

마지막으로 해결책을 얻었습니다. 데이터베이스에있는 열 값을 새 사용자 정의 개체 값과 비교하려면 ParameterExpression을 사용해야합니다. 그런 다음 setParameter에서 동일한 별칭을 사용하여 해당 값을 사용합니다.이 코드는 다음과 같이 바뀝니다.

그런 다음 setParameter에서 별칭 "currentDate"를 사용하고 거기에 currentDateForUserTimezone 값을 설정합니다. 그러면 원하는 필드 값과 비교됩니다. }