0

これは Oracle で動作しますが、MySQL に切り替えるように言われました。ドライバー情報とその他の関連設定を MySQL DB を指すように変更した後、名前付きクエリを実行できなくなりました。エンティティで定義されている最も単純なものを次に示します。

@NamedQuery(name="get_capability", query="select cb from Capability cb where cb.financial_Id = :fiId")

次に、次のようにクエリを実行するコードがあります。

query = em.createNamedQuery("get_capability");

. . .

query.setParameter("fiId", fiId);

query.setMaxResults(1);

cabability = (機能) query.getSingleResult();

この最後の行は例外をスローします:

2013-04-24 10:46:00,677 WARN [org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-1) SQL エラー: 1248、SQLState: 42000

2013-04-24 10:46:00,677 ERROR [org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-1) すべての派生テーブルには独自のエイリアスが必要です

生成される SQL は、次のようにログ ファイルに記録されます。

/* named HQL query get_capability */ select
    * 
from
    ( select
        capability0_.FINANCIAL_ID as FINANCIAL1_272_,
        capability0_.ACTIVE_CONNECTIONS as ACTIVE2_272_,
        capability0_.ALLOWED_CONNECTIONS as ALLOWED3_272_,
        capability0_.COMPLETE_DETAILS as COMPLETE4_272_,
        capability0_.FI_NAME as FI5_272_,
        capability0_.MESSAGE_FORMAT as MESSAGE6_272_,
        capability0_.PROVIDER_ID as PROVIDER7_272_,
        capability0_.STATUS as STATUS272_,
        capability0_.SUPPORTS_ACCOUNTS as SUPPORTS9_272_,
        capability0_.SUPPORTS_CUSTOMER as SUPPORTS10_272_,
        capability0_.SUPPORTS_IMAGE as SUPPORTS11_272_,
        capability0_.SUPPORTS_STATEMENTS as SUPPORTS12_272_,
        capability0_.SUPPORTS_TRANSACTIONS as SUPPORTS13_272_,
        capability0_.SUPPORTS_TRANSFER as SUPPORTS14_272_ 
    from
        INSTITUTION capability0_ 
    where
        capability0_.FINANCIAL_ID=? ) 
where
    rownum <= ?

このエラーの意味を読みました。すべての派生テーブルにエイリアスが必要であり、エイリアスを追加することで派生 SQL を編集して機能させることができます。私の質問はこれです。これは派生クエリ (SQL) であるため、hibernate にエイリアスを追加するように指示したり、MySQL にそれを必要としないように指示したりするにはどうすればよいですか?

休止状態の部分構成:

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />   
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
<property name="hibernate.showSql" value="true" /> 
<property name="hibernate.format_sql" value="true"/> 
<property name="hibernate.use_sql_comments" value="true"/>
4

2 に答える 2

1

は MySQL でサポートされていない Oracle キーワードであるためROWNUM(たとえば、この質問を参照してください)、Hibernate はクエリを作成するときにまだ Oracle をターゲットにしていると思います。

対応する Hibernate ダイアレクトに変更したことを確認します。

(後世のために回答を追加)

于 2013-04-24T21:51:56.560 に答える
0

FROM のサブクエリは「派生テーブル」です。その派生テーブルに名前を付ける必要があります。

このようなものが動作するはずです

select
    RES.field1, RES.field2 
from
    ( select
        capability0_.FINANCIAL_ID as FINANCIAL1_272_,
        capability0_.ACTIVE_CONNECTIONS as ACTIVE2_272_,
        capability0_.ALLOWED_CONNECTIONS as ALLOWED3_272_,
        capability0_.COMPLETE_DETAILS as COMPLETE4_272_,
        capability0_.FI_NAME as FI5_272_,
        capability0_.MESSAGE_FORMAT as MESSAGE6_272_,
        capability0_.PROVIDER_ID as PROVIDER7_272_,
        capability0_.STATUS as STATUS272_,
        capability0_.SUPPORTS_ACCOUNTS as SUPPORTS9_272_,
        capability0_.SUPPORTS_CUSTOMER as SUPPORTS10_272_,
        capability0_.SUPPORTS_IMAGE as SUPPORTS11_272_,
        capability0_.SUPPORTS_STATEMENTS as SUPPORTS12_272_,
        capability0_.SUPPORTS_TRANSACTIONS as SUPPORTS13_272_,
        capability0_.SUPPORTS_TRANSFER as SUPPORTS14_272_ 
    from
        INSTITUTION capability0_ 
    where
        capability0_.FINANCIAL_ID=? ) **RES**
where
    rownum <= ?
于 2015-08-10T19:19:36.717 に答える