如何在JPA中使用prepared语句
我是一名play框架应用程序开发人员。我在JPA中使用createNativeQuery方法。在这个例子中,我想使用prepared语句。谁能帮帮我? 下面是没有JPA的代码。我需要帮助将其转换为准备好的语句如何在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='"
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);