3

現在tomcat/CloudFoundryで動作しているHibernateWebアプリがありますが、JBossで実行しようとすると、いくつかのエラーが発生します。

私のDAOでは、次のように、userNameでユーザーをロードするクエリを作成しています。

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

上記は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_JpaExceptionTranslatorAspect$1$18a1ac9(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

次の両方のクエリに変更しようとしましたが、それでもうまくいきません。

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

上記は私に同じエラーを与えます。のように:

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

また、名前付きパラメーターに切り替えると、名前付きパラメーターを見つけることができないというエラーが発生します。

何か案は?(余談ですが、JBossのクエリでDAOを完全修飾アカウントに更新する必要がありました-Tomcatではアカウントのクエリだけで機能していました)

4

4 に答える 4

0

私の場合でも、何も機能していませんでした。

  1. インデックス 0 の定位置パラメーター
  2. インデックス 1 の定位置パラメーター
  3. 名前付きパラメーター

最後に、結果のクエリ オブジェクトのパラメータ リストが毎回空で、呼び出し中にエラーが発生することがわかりましたsetParameter()

解決策: エンティティ マッピングがpersistence.xmlファイルにありませんでした。追加した後、動作し始めました!!

于 2015-09-24T08:20:58.557 に答える
0

Hibernate HQLリファレンスに基づいて、JDBC 位置スタイルを使用する場合は、を使用するだけ?です。名前付きパラメータを使用している場合は、 を使用する必要があります:paramName

于 2012-04-09T16:03:56.557 に答える