一尘不染

具有命名参数的本机查询失败,提示“未设置所有命名参数”

hibernate

我想执行一个简单的本机查询,但是它不起作用:

@Autowired
private EntityManager em;

Query q = em.createNativeQuery("SELECT count(*) FROM mytable where username = :username");
em.setProperty("username", "test");
(int) q.getSingleResult();

为什么会出现此异常?

org.hibernate.QueryException: Not all named parameters have been set: [username]

阅读 267

收藏
2020-06-20

共1个答案

一尘不染

JPA在本机查询中不支持命名参数,仅对于JPQL。您必须使用位置参数。

命名参数遵循第4.4.1节中定义的标识符规则。命名参数的使用适用于Java Persistence查询语言,而不是为本机查询定义的。
仅位置参数绑定可用于本机查询。

所以用这个

Query q = em.createNativeQuery("SELECT count(*) FROM mytable where username = ?1");
q.setParameter(1, "test");

尽管JPA规范在本机查询中不支持命名参数,但某些JPA实现(例如Hibernate)可能会支持它

本机SQL查询支持位置参数和命名参数

但是,这会将您的应用程序耦合到特定的JPA实现,因此使其不可移植。

2020-06-20