【发布时间】:2016-11-19 07:07:22
【问题描述】:
这是我正在执行的查询实例
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]
当使用硬编码到查询本身的参数执行上述查询时,查询执行得很好,结果被提取并映射到与@SqlResultSetMapping 对应的RESULT_MAPPER,但是当使用上述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'
使用参数查询
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 ?
在代码中声明的原生查询
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";
【问题讨论】:
-
您能否添加导致问题的 SHIPMENTS_UNION_QUERY 的代码?
-
请发布您尝试执行的查询。
-
发现问题了,我一直将参数作为引用文本而不是setParameter中的List发送到IN子句,但仅在Hibernate中支持
标签: java hibernate spring-data-jpa jpa-2.0 jpa-2.1