如何在JPA中使用准备好的语句
-
21-12-2019 - |
题
我是一名 Play 框架应用程序开发人员。我在 JPA 中使用 createNativeQuery 方法。在这个例子中我想使用准备好的语句。请有人帮助我吗?这是没有 JPA 的代码。我需要帮助将其转换为准备好的语句。
Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join" +
"box b where t.truck_id=b.truck_id and t.shipment_upc='" + code + "'");
BigInteger val = (BigInteger)query.getSingleResult();
System.out.println(val);
解决方案
Query query = JPA.em().createNativeQuery("select count(*) from truck t inner join box b where t.truck_id=b.truck_id and t.shipment_upc=:code");
query.setParameter("code", code);
. 其他提示
简要总结
您需要在此处使用查询参数,但由于您使用的是 原生查询, ,与 JPQL 相比,您的选择可能会受到限制。
世界现状
你可能 仅限于位置参数:
JPA 不要求本机查询支持命名参数,但某些 JPA 提供程序可能会
Hibernate对JPA的实现 支持命名参数:
本机 SQL 查询支持位置参数和命名参数
解决方案
休眠
苏比尔·库马尔·萨奥的回答 展示如何使用命名参数来解决这个问题。至少在 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
参数映射只是位置参数的索引。
其他来源
不隶属于 StackOverflow