Как мне получить и / или установить параметры предикатного CriteriaQuery? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь реорганизовать мои спецификации Spring (org.springframework.data.jpa.domain.Specification), чтобы использовать классы JSR 310. Другими словами, в моих спецификациях используется Дата, а я хочу использовать Мгновенный.

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

Если есть такие же, как после рефакторинга, то все должно быть хорошо.

Однако параметры моего запроса всегда пусты. Если я пытаюсь установить их, я получаю IllegalArgumentExcpeption.

    Instant now = Instant.now();
    Specification<Sp> sp = SpSpecification.betweenDates(now, now);

    CriteriaBuilder cb = entityManagerFactory.getCriteriaBuilder();
    CriteriaQuery<Sp> q = cb.createQuery(Sp.class);
    Root<Sp> root = q.from(Sp.class);

    Predicate p = sp.toPredicate(root, q, cb);
    q.where(p);

    TypedQuery<Sp> typedQuery = entityManagerFactory.createEntityManager().createQuery(q);

    List<Sp> resultList = typedQuery.getResultList();

    // doesn't show the parameter values
    String queryString = typedQuery.unwrap(org.hibernate.Query.class).getQueryString();
    // always empty
    System.out.println(typedQuery.getParameters());
    // ok get named parameters --> [param5, param0, param3, param4, param1, param2]
    String[] namedParameters = typedQuery.unwrap(org.hibernate.Query.class).getNamedParameters();
    // try and set one of them -> IllegalArgumentException (Unable to locate parameter registered with that name)
    typedQuery.setParameter("param5", now);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...