Java JPA本机查询中的位置参数问题

Java JPA本机查询中的位置参数问题,java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我正在努力做到: String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like '?1')"; List results = em.createNativeQuery(sql).setParameter(1, username).getResultList(); 但是我得到了IllegalArgumentException,它告诉我参数超出了范围。我做错了什么?参数周围不应该有引号。请尝试以下方法:

我正在努力做到:

String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like '?1')";
List results = em.createNativeQuery(sql).setParameter(1, username).getResultList();

但是我得到了IllegalArgumentException,它告诉我参数超出了范围。我做错了什么?

参数周围不应该有引号。请尝试以下方法:

String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like ?1)";
您可能还想再次检查您的意思是否真的是
键入“B”
,因为这可能与您认为的不一样。

a)为什么要将本机SQL用于这样的简单查询?使用JPQL。
b) 如果不使用通配符,为什么要使用like?改用
=

String jpql =
  "SELECT u.email FROM users u WHERE (u.type = 'B') AND (u.username = '?1')";

List results = 
    em.createQuery(jpql)
      .setParameter(1, username)
      .getResultList();

我认为它们是以1为基础的(与逻辑相反)@Bozho:当然?与JDBC相反,Hibernate从零开始对参数进行编号。啊,对。我总是使用命名参数,所以我一直没有做到:)Hibernate参数是基于0的。JPA是以1为基础的。您的语法适用于Hibernate,但不符合JPA规范。我将尝试您的语法,稍后我们将看到。like匹配通配符模式。”B'是一个没有通配符的字符串。use=而不是like我没有面向用户的对象表示,所以特别是因为这是一个简单的查询,所以我选择了Native。实际上,我有一个包含很多实体的大型数据库,所有这些都是用JPA很好地完成的,但是我有一个外部数据库,用于2-3个查询(比如这一个),所以我选择对本机查询保持简单。