如何在JPA中使用预准备语句

时间:2014-04-11 09:39:24

标签: jpa prepared-statement playframework-2.1

我是一个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);

2 个答案:

答案 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);

Generic 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参数映射中的键只是位置参数的索引。

其他来源