java 将 Hibernate 应用程序移至 JBoss - 位置超出声明的序数参数数量

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10075740/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 23:30:23  来源:igfitidea点击:

Moving Hibernate app to JBoss - Position beyond number of declared ordinal parameters

javahibernatejboss

提问by rhinds

i have a Hibernate web app that is currently working on tomcat/CloudFoundry, but when i try to run it on JBoss I am getting some errors.

我有一个目前正在 tomcat/CloudFoundry 上运行的 Hibernate web 应用程序,但是当我尝试在 JBoss 上运行它时,我遇到了一些错误。

In my DAO I am creating a query to load Users by userName, as follows:

在我的 DAO 中,我正在创建一个查询以按用户名加载用户,如下所示:

Query query = getEntityManager().createQuery("select u from com.tmm.enterprise.socialcv.security.Account u where u.userName = ?1");
query.setParameter(1, userName);

The above works when I run the app on Tomcat, but when I run it on JBoss I get the following error:

当我在 Tomcat 上运行该应用程序时,上述内容有效,但是当我在 JBoss 上运行它时,出现以下错误:

16:31:47,639 DEBUG [org.springframework.web.servlet.DispatcherServlet] (http-localhost-127.0.0.1-8080-1) Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'dataAccessFailure'; model is {exception=org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1}: org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:301) [org.springframework.orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]
    at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspecta1ac9(JpaExceptionTranslatorAspect.aj:15) [spring-aspects-3.1.1.RELEASE.jar:3.1.1.RELEASE]
    at com.tmm.enterprise.socialcv.security.dao.AccountDAO.loadAccountByUserName(AccountDAO.java:28) [classes:]
    at com.tmm.enterprise.socialcv.service.AccountService.loadAccountByUserName(AccountService.java:48) [classes:]
    at com.tmm.enterprise.socialcv.service.AccountService.setCredentials(AccountService.java:241) [classes:]
    at com.tmm.enterprise.socialcv.controller.HomeController.signup(HomeController.java:59) [classes:]
    ...
Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:446) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:67) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    ... 80 more
Caused by: org.hibernate.QueryParameterException: ***Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 1***
    at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:80) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:86) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:444) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:416) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:440) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    ... 81 more

I have tried changing to both the following queries but still no luck:

我尝试更改为以下两个查询,但仍然没有运气:

Query query = getEntityManager().createQuery("select u from com.tmm.enterprise.socialcv.security.Account u where u.userName = ?");
        query.setParameter(0, userName);

The above gives me the same error. As does:

以上给了我同样的错误。就像:

Query query = getEntityManager().createQuery("select u from com.tmm.enterprise.socialcv.security.Account u where u.userName = ?");
        query.setParameter(1, userName);

And switching to named parameters gives me an error about not being able to locate named parameter.

切换到命名参数会给我一个关于无法定位命名参数的错误。

Any ideas? (as an aside, I also had to update the DAO to fully qualified Account in the query on JBoss - on tomcat it was working just querying Account)

有任何想法吗?(顺便说一句,我还必须在 JBoss 的查询中将 DAO 更新为完全合格的 Account - 在 tomcat 上,它只是在查询 Account)

回答by Schmel

I fixed such error in that way

我以这种方式修复了这样的错误

schema.table = ' ?' ->error

schema.table = '?' ->no error

Maybe it helps someone.

也许它可以帮助某人。

回答by christopher wilbert

query = getEntityManager().createQuery(
"select u from com.tmm.enterprise.socialcv.security.Account u where u.userName = :userName");
query.setParameter("userName", userName);

回答by user1394523

Even in my case nothing was working, I have tried

即使在我的情况下没有任何效果,我已经尝试过

  1. Positional parameter with index 0
  2. Positional parameter with index 1
  3. Named parameter
  1. 索引为 0 的位置参数
  2. 索引为 1 的位置参数
  3. 命名参数

Finally I found that parameter list of the resulted query object was empty every time resulting in error while calling setParameter().

最后我发现结果查询对象的参数列表是空的,每次调用setParameter().

Solution: the entity mapping was missing in the persistence.xmlfile, after adding it, it started working!!

解决方法:persistence.xml文件中缺少实体映射,添加后就可以使用了!!

回答by nobeh

Based on Hibernate HQL reference, if you use JDBC positional style, you onlyhave to use ?. If you're using named parameters then you should use :paramName.

基于 Hibernate HQL参考,如果您使用 JDBC 位置样式,则只需使用?. 如果您使用的是命名参数,那么您应该使用:paramName.