【问题标题】:How to use prepared statement in JPA如何在 JPA 中使用准备好的语句
【发布时间】:2014-04-11 09:39:24
【问题描述】:

我是一个播放框架应用程序开发人员。我在 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);

【问题讨论】:

  • 使用参数t.shipment_upc= :upc -> setParameter("upc", code)
  • 感谢您的回复。我是初学者。你能详细告诉我吗..提前谢谢。
  • Subir 的回答指出:)
  • 非常感谢您

标签: jpa prepared-statement playframework-2.1


【解决方案1】:
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);

【讨论】:

  • 嘿@SubirKumarSao,使用像“:xxx”这样的标签的参数仅在“createQuery”上不起作用,至少在我使用EclipseLink的设置中,你确定上面的代码运行吗?如果是的话,你能告诉我你使用的是什么版本的东西吗?谢谢合作。
  • 它非常适合选择和更新。我想知道如何为插入做同样的事情
  • @Drix 您正确地观察到这在 EclipseLink 中是不可能的(至少从 2.5.1 开始)。请参阅my answer 了解与 EclipseLink 兼容的解决方案 — 结合位置参数。
【解决方案2】:

简要总结

您需要在此处使用查询参数,但由于您使用的是本机查询,因此与 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);

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

其他来源

【讨论】:

  • 谢谢!这应该被标记为答案
猜你喜欢
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多