Hibernate спецификация не использует параметры SQL Server - PullRequest
0 голосов
/ 18 февраля 2019

Я написал собственный предикат, который я использую в запросе JpaSpecificationExecutor.Сгенерированный SQL для этого запроса не использует параметр, и, следовательно, кэш запроса имеет 2 записи (так как запросы отличаются на 1 символ!).Является ли использование агрегатной функции причиной разницы, которую я вижу?(обрисовано в общих чертах ниже).

Мое приложение использует sqlserver 2012 для своей базы данных, и я отслеживал запросы через управляющую студию sqlserver.Вывод, который я наблюдал, используя параметры для billingType и recordedDate, но не recordedValue.

Ниже приведен код предиката, который я использовал:

Subquery<Entity> subQuery = query.subquery(Entity.class);
Root<Entity> subQueryRoot = subQuery.from(Entity.class);
subQuery.select(subQueryRoot.get("userId"));

Optional<Predicate> teamEquals = // Call to helper

Predicate isMinutes = builder.equal(subQueryRoot.get("billingType"), BillingType.MINUTES);
Predicate minutesDate = builder.greaterThan(subQueryRoot.get("recordedDate"), LocalDate.now().minus(Period.parse(params.getHoursPeriod())));
Predicate minutesThreshold = builder.greaterThan( subQueryRoot.get("recordedValue"), params.getHours() * 60 );
Predicate minutesRestriction = builder.and(isMinutes, minutesDate, minutesThreshold);

Predicate isDocuments = builder.equal(subQueryRoot.get("billingType"), BillingType.DOCUMENTS);
Predicate documentsDate = builder.greaterThan(subQueryRoot.get("recordedDate"), LocalDate.now().minus(Period.parse(params.getDocumentsPeriod())));
Predicate documentsThreshold = builder.greaterThan( subQueryRoot.get("recordedValue"), params.getDocuments() );
Predicate documentsRestriction = builder.and(isDocuments, documentsDate, documentsThreshold);

subQuery.where( builder.and(teamEquals.get(), builder.or( minutesRestriction, documentsRestriction ) ) );
return Optional.of(subQuery);

Thisприводит к 2 сгенерированным запросам, отличающимся на 1 символ.Например (В HQL) SELECT * FROM User where id IN (SELECT userId FROM Entity WHERE billingType = @p1 AND recordedDate > @p2 AND recordedValue > 0) против SELECT * FROM User where id IN (SELECT userId FROM Entity WHERE billingType = @p1 AND recordedDate > @p2 AND recordedValue > 40)

1 Ответ

0 голосов
/ 28 марта 2019

Звучит так, как будто это следующая ошибка Hibernate https://hibernate.atlassian.net/browse/HHH-9576

Также существует обходной путь, задокументированный на Почему список параметров встроенного целого числа Hibernate передан в JPA Criteria Query?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...