简要概述
在这里,您需要使用查询参数,但由于您正在使用本机查询,因此与JPQL相比,您的选项可能受到限制。
世界状态
您可能仅限于位置参数:
JPA不要求本机查询支持命名参数,但某些JPA提供程序可能会支持
Hibernate对JPA的实现支持命名参数:
本机SQL查询支持位置参数和命名参数
解决方案
Hibernate
Subir Kumar Sao的答案展示了如何使用命名参数解决此问题。至少在Hibernate中是可行的。
为了比较起见,我将在此重复它:
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = :code"
);
query.setParameter("code", code);
通用JPA(包括EclipseLink)
我发现在EclipseLink(2.5.1)中不支持命名参数。
相反,需要使用位置参数。这可以通过两种方式来表达-显式和隐式。
显式索引
使用?1
(或其他数字)标记参数。此索引可用于在查询中唯一标识该特定参数。
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?1"
);
query.setParameter(1, code);
隐式索引
只需使用?
来标记参数。它的索引将基于参与查询字符串的所有参数的顺序。
Query query = JPA.em().createNativeQuery(
"SELECT COUNT(*) "+
"FROM truck AS t "+
"INNER JOIN box b "+
"WHERE t.truck_id = b.truck_id "+
"AND t.shipment_upc = ?"
);
query.setParameter(1, code);
注意事项
请注意以下内容:
- 位置参数从1开始计数。
Query
参数映射中的键仅为定位参数的索引。
其他参考资料
t.shipment_upc= :upc
->setParameter("upc", code)
。 - Paul Samsotha