Я пытаюсь реорганизовать мои спецификации 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);