我是一名 Play 框架应用程序开发人员。我在 JPA 中使用 createNativeQuery 方法。在这个例子中我想使用准备好的语句。请有人帮助我吗?这是没有 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);
有帮助吗?

解决方案

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);
.

其他提示

简要总结

您需要在此处使用查询参数,但由于您使用的是 原生查询, ,与 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 索引的。
  • 关键在 Query 参数映射只是位置参数的索引。

其他来源

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top