2016-11-19 5 views
0

Вот экземпляр запроса я выполнениеjavax.persistence.Query не установлен параметр

entityManager.createNativeQuery(SHIPMENTS_UNION_QUERY, RESULT_MAPPER) 
       .setParameter("aggreagateCategories", aggregatePCNames) 
       .setParameter("startDate", startDate) 
       .setParameter("endDate", endDate) 
       .setParameter("individualCategories", individualPCNames) 
       .getResultList(); 

Бревна для выполнения указанных выше линий

12:29:36.909 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> endDate [3] 
12:29:36.910 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> endDate [6] 
12:29:36.910 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 'AirConditioner' -> aggreagateCategories [1] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> startDate [2] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> startDate [5] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 'Cooler', 'Heater', 'Dryer' -> individualCategories [4] 

Когда вышеупомянутый запрос выполненный с параметром hardcoded в самом запросе, запрос выполняется просто отлично, и результаты извлекаются и сопоставляются с RESULT_MAPPER, что соответствует @SqlResultSetMapping, но когда это делается с указанными выше операторами setParameter, выполнение не отменяет никаких результатов.

Пожалуйста, помогите определить проблему.

EDIT1

Запрограммированные Запрос

SELECT ac.category_name category_name, SUM(ais.volume) volume, qc.date, qc.quarter as quarter, qc.year 
FROM actual_industry_shipment ais 
JOIN quarter_calendar qc ON ais.quarter=qc.id 
JOIN product_category pc ON ais.product_category_id=pc.id 
JOIN aggregated_product_categories ac ON ac.id = pc.aggregate_category_id 
WHERE ac.category_name IN ('AirConditioner') 
AND qc.date BETWEEN '2010-01-01' AND '2011-01-01' 
GROUP BY pc.aggregate_category_id, qc.quarter, qc.year 
UNION 
SELECT pc.category_name category_name, ais.volume volume, qc.date, qc.quarter as quart, qc.year 
FROM actual_industry_shipment ais 
JOIN quarter_calendar qc ON ais.quarter=qc.id 
JOIN product_category pc ON ais.product_category_id=pc.id 
WHERE pc.category_name IN ('Dryer', 'Cooler') 
AND qc.date BETWEEN '2010-01-01' AND '2011-01-01' 

Запрос с Params

SELECT ac.category_name category_name, SUM(ais.volume) volume, qc.date, qc.quarter as quarter, qc.year 
FROM actual_industry_shipment ais 
JOIN quarter_calendar qc ON ais.quarter=qc.id 
JOIN product_category pc ON ais.product_category_id=pc.id 
JOIN aggregated_product_categories ac ON ac.id = pc.aggregate_category_id 
WHERE ac.category_name IN (?) 
AND qc.date BETWEEN ? AND ? 
GROUP BY pc.aggregate_category_id, qc.quarter, qc.year 
UNION 
SELECT pc.category_name category_name, ais.volume volume, qc.date, qc.quarter as quart, qc.year 
FROM actual_industry_shipment ais 
JOIN quarter_calendar qc ON ais.quarter=qc.id 
JOIN product_category pc ON ais.product_category_id=pc.id 
WHERE pc.category_name IN (?) 
AND qc.date BETWEEN ? AND ? 

Native запроса, который объявлен в коде

private static final String SHIPMENTS_UNION_QUERY = 
     "SELECT ac.category_name category_name, SUM(ais.volume) volume, qc.date, qc.quarter as quarter, qc.year " + 
       "FROM actual_industry_shipment ais " + 
       "JOIN quarter_calendar qc " + 
       "ON ais.quarter=qc.id " + 
       "JOIN product_category pc " + 
       "ON ais.product_category_id=pc.id " + 
       "JOIN aggregated_product_categories ac " + 
       "ON ac.id = pc.aggregate_category_id " + 
       "WHERE " + 
       "ac.category_name IN (:aggreagateCategories) " + 
       "AND qc.date BETWEEN :startDate AND :endDate " + 
       "GROUP BY " + 
       "pc.aggregate_category_id, qc.quarter, qc.year " + 

       "UNION " + 

       "SELECT pc.category_name category_name, ais.volume volume, qc.date, qc.quarter as quart, qc.year " + 
       "FROM actual_industry_shipment ais " + 
       "JOIN quarter_calendar qc " + 
       "ON ais.quarter=qc.id " + 
       "JOIN product_category pc " + 
       "ON ais.product_category_id=pc.id " + 
       "WHERE pc.category_name IN (:individualCategories) " + 
       "AND qc.date BETWEEN :startDate AND :endDate"; 
+0

Вы можете добавить код для SHIPMENTS_UNION_QUERY, а что является причиной проблемы? – developer

+0

Отправьте запрос, который вы пытаетесь выполнить. –

+0

Нашел проблему, я отправил параметр в предложение IN в качестве цитированного текста вместо List в setParameter, но который поддерживается только в Hibernate –

ответ

0

Названный PARAMS запрос НЕ точно так же, как оригинальный жесткий кодированный Native SQL Query, вы можете посмотреть ниже (взято только различались раздел запроса):

Параметр запроса

category_name, ais.volume volume, qc.date, 
qc.quarter as quart, qc.year FROM 
actual_industry_shipment ais 
JOIN quarter_calendar qc ON 

Hard кодированный запрос:

ais.quarter=qc.id JOIN category_name, 
ais.volume volume, product_category pc ON ais.product_category_id=pc.id WHERE 
pc.category_name IN ('Dryer', 'Cooler') AND qc.date 
BETWEEN '2010-01-01' AND '2011-01-01' 
+0

Я использую именованный параметр, добавив еще одно обновление –

+0

, пожалуйста, зарегистрируйтесь сейчас –

+0

JPA не требует, чтобы реализации поддерживали именованные параметры в собственных запросах, но Hibernate делает это в качестве бонусной функции. Он не будет работать, если OP переключится на EclipseLink, но это не проблема. – coladict

0

Ваш параметр дата не связаны, как строки, как жесткий кодированный запрос, кажется, и который работает, также тот же день применяется в обоих дату начала и конца отличается от жесткого закодирована запрос.

12:29:36.909 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> endDate [3] 
12:29:36.910 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> endDate [6] 
12:29:36.910 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 'AirConditioner' -> aggreagateCategories [1] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> startDate [2] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> startDate [5] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 'Cooler', 'Heater', 'Dryer' -> individualCategories [4] 

Ваш запрос, который работает имеет даты в кавычках,

BETWEEN '2010-01-01' AND '2011-01-01' 
+0

Ты ЛЮБЛЮ. Он привязывает ту же дату к startDate и endDate. Мой коллега сделал то же самое, не понимая, что ему нужно использовать новый объект 'java.util.Date' для установки обоих параметров, вместо повторного использования его и вызова' setYear' или того, что использует OP. То, что он сделал, было «Date endDate = startDate; endDate.setMonth (...); 'затем привяжите его. Я думаю, что мой OP должен был сделать то же самое, не понимая, что endDate и startDate являются одним и тем же объектом, а не копиями друг друга. – coladict

+0

@ coladict мой улов достаточно хорош, чтобы его приняли? – ScanQR

0

Здесь мы видим проблему:

12:29:36.909 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> endDate [3] 
12:29:36.910 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> endDate [6] 
12:29:36.910 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 'AirConditioner' -> aggreagateCategories [1] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> startDate [2] 
12:29:36.912 DEBUG org.hibernate.loader.Loader : bindNamedParameters() 2010-01-01 -> startDate [5] 

Вы связывающую ту же дату на обоих. Я предполагаю, что ваш код будет выглядеть примерно так:

Date endDate = getDateParameter(...); 
Date startDate = endDate; 
startDate.setYear(endDate.getYear()-1); 

Проблема в том, что startDate и endDate не являются копиями друг-друга, но точно такой же объект. Когда вы меняете дату в startDate, вы изменили ее на endDate. Вы должны скопировать его следующим образом:

Date startDate = new Date(endDate.getTime()); 
+0

Я не думаю, что это проблема, дата отлично работает как строка, как я дал, даже между той же датой. –

 Смежные вопросы

  • Нет связанных вопросов^_^