use*_*863 9 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);
Run Code Online (Sandbox Code Playgroud)
Sub*_*Sao 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);
Run Code Online (Sandbox Code Playgroud)
您需要在此处使用查询参数,但由于您使用的是本机查询,因此与JPQL相比,您的选项可能会受到限制.
您可能仅限于位置参数:
JPA不要求本机查询支持命名参数,但某些JPA提供程序可能
Hibernate的JPA实现支持命名参数:
本机SQL查询支持位置和命名参数
Subir Kumar Sao的回答显示了如何使用命名参数解决这个问题.至少在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);
Run Code Online (Sandbox Code Playgroud)
我发现使用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);
Run Code Online (Sandbox Code Playgroud)
使用just标记参数?.它的索引将基于参与查询字符串的所有参数的顺序.
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);
Run Code Online (Sandbox Code Playgroud)
观察:
Query参数图中的关键字只是位置参数的索引.| 归档时间: |
|
| 查看次数: |
23337 次 |
| 最近记录: |