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个查询(比如这一个),所以我选择对本机查询保持简单。