我是一个Play框架应用程序Developer.I我在JPA中使用createNativeQuery方法。在这个例子中,我想使用预准备语句。请有人帮帮我吗? 这是没有JPA的代码。我需要帮助才能将其转换为Prepared语句。
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);
答案 0 :(得分:15)
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);
答案 1 :(得分:5)
您需要在此处使用查询参数,但由于您使用的是本机查询,因此与JPQL相比,您的选项可能会受到限制。
您可能是limited to positional parameters:
JPA不要求本机查询支持命名参数,但某些JPA提供程序可能
Hibernate实现JPA supports named parameters:
本机SQL查询支持位置和命名参数
Subir Kumar Sao's answer显示了如何使用命名参数解决此问题。至少在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);
我发现使用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);
观察:
Query
参数映射中的键只是位置参数的索引。