Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JPA中使用prepared语句_Jpa_Prepared Statement_Playframework 2.1 - Fatal编程技术网

如何在JPA中使用prepared语句

如何在JPA中使用prepared语句,jpa,prepared-statement,playframework-2.1,Jpa,Prepared Statement,Playframework 2.1,我是一名play框架应用程序开发人员。我在JPA中使用createNativeQuery方法。在这个例子中,我想使用prepared语句。谁能帮帮我? 下面是没有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='"

我是一名play框架应用程序开发人员。我在JPA中使用createNativeQuery方法。在这个例子中,我想使用prepared语句。谁能帮帮我? 下面是没有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);
小结 您需要在这里使用查询参数,但由于您使用的是本机查询,与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索引
  • 查询
    参数映射中的键只是位置参数的索引

其他来源

使用参数
t.shipping\u upc=:upc
->
setParameter(“upc”,code)
谢谢您的回复。我是初学者。你能详细地告诉我吗。。提前感谢。Subir的回答指出:)非常感谢@SubirKumarSao,使用“:xxx”等标记的参数在“createQuery”上不起作用,但在“createQuery”上不起作用,至少在我使用EclipseLink的设置上不起作用,你确定上面的代码运行吗?如果是,你能告诉我你用的是什么版本的东西吗?用于协作的thx。它可以完美地用于选择和更新。我想知道如何为你做同样的事情insert@Drix你观察到这在日食中是不可能的(至少从2.5.1开始)。有关与EclipseLink兼容的解决方案,请参阅-合并位置参数。谢谢!这应该标记为答案
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);