Я написал собственный предикат, который я использую в запросе 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)