Spring Boot JPA Спецификация для сравнения дат - PullRequest
0 голосов
/ 05 ноября 2018

Мне нужно найти записи таблицы, которые появятся между датами, пройденными пользователем. Я пытаюсь написать спецификацию для этого, но она показывает мне ошибку времени компиляции, как показано ниже:

The method between(Expression<? extends Y>, Expression<? extends Y>, Expression<? extends Y>) 
in the type CriteriaBuilder 
is not applicable for the arguments (Expression<Date>, Object, Object)

Я пробовал поиск по различным форумам, но не смог понять, как решить эту проблему, возможно, я делаю что-то не так. Пожалуйста, помогите мне в этом.

Спецификация класса

public class ScheduleClassSpecification implements Specification<ScheduleClassInformation> {

private SearchCriteria criteria;

@Override
public Predicate toPredicate(Root<ScheduleClassInformation> root,
        CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
    Expression<String> expression;
    Predicate predicate =null;

    if((criteria.getKey().equalsIgnoreCase("student"))){
         expression = root.join("course").join("student").get("student");
         predicate = criteriaBuilder.equal(expression, criteria.getValue());
    }else if(criteria.getKey().equalsIgnoreCase("startDate") || criteria.getKey().equalsIgnoreCase("endDate")){
        predicate = criteriaBuilder.between
                        (root.<Date>get(criteria.getKey()).as(java.util.Date.class), 
                                criteria.getValue(), 
                                criteria.getValue());  // Compile Time Error on this line

    }

    return predicate;
}

Класс критериев

public class SearchCriteria {
    private String key;
    private String operation;
    private Object value;}

Сервис для извлечения записи из репозитория

if(!Utility.isNull(Id)){
                idSpec = new ScheduleClassSpecification(new SearchCriteria("Student",":",Id));
            }

            Page<SCOutput>  listreturn = scRepo.findAll(Specification.where(idSpec), SCOutput.class,new PageRequest(0, 100));

1 Ответ

0 голосов
/ 05 ноября 2018

Как говорит ошибка компилятора, вам нужно Expression.

Вы можете легко сделать это, заменив criteria.getValue() на criteriaBuilder.literal(criteria.getValue())

...