0

データベースアクセスにHibernateを使用しています。コードで次のクエリを使用して、必要なデータをフェッチしています。

SELECT proasset
FROM com.company.claims.participant.AbstractBeneficiary bene
JOIN bene.approvals approval
JOIN bene.proassetkey proasset
join proasset.relatedparties proassetparties
WHERE approval.user_dt > :currentDate
AND approval.user_type = :userType

私はそれをquery次のように使用しています:

Query q = this.getSessionFactory().getCurrentSession().createSQLQuery(query.toString())
q.setDate("currentDate", new Date());
q.setString("userType", APPROVER_USER_TYPE);
List<ProAsset> proassets = q.list();

ただし、実行しようとすると、次の問題が発生します。

SQL Error: 933, SQLState: 42000
ORA-00933: SQL command not properly ended

重要な場合、クエリはを使用して構築されており、行を分割するためStringBuilderに使用されます\n

問題について何か考えはありますか?

4

3 に答える 3

4

ORMをネイティブ(プレーンな古いSQL)クエリと混合しようとしているようです。

createSQLQueryにはネイティブSQLが必要です。テーブル名の代わりにクラスを使用しています。これを読んでみてください:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html

つまり、次のようなクエリを作成する必要があります。

select fu
from bar
where situation = 'snafu'

おそらく、あなたは本当にnamedQueryを書きたいのでしょうか?例で行っているように、エンティティを結合するORM構文を使用します。

これらの例を確認してください。

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#querysql-namedqueries

于 2012-08-08T00:37:02.667 に答える
0

不適切な句を削除して構文を修正してください。削除された句を別のSQLステートメントと複製できる場合があります。たとえば、ビューの行を並べ替えるには、ビューを作成するときではなく、クエリを実行するときに並べ替えます。このエラーは、継続行がインデントされている場合、SQL*Formsアプリケーションでも発生する可能性があります。インデントされた行を確認し、これらのスペースを削除します。

于 2012-08-08T05:34:36.833 に答える
0

了解しました。createQuery()の代わりにcreateSQLQuery()を使用し、変数名の代わりに列名を使用しました。

これが私のコードが今どのように見えるかです:

StringBuilder query = new StringBuilder();

query.append("SELECT proasset\n" +
            "FROM com.avivausa.claims.participant.AbstractBeneficiary bene\n" +
            "JOIN bene.approvals approval\n" +
            "JOIN bene.proAsset proasset\n" +
            "join proasset.additionalParties proassetparties\n" +
            "WHERE approval.userDate < current_date()\n");
query.append("AND approval.userType = ").append(UserAuditType.APPROVER);

Query q = this.getSessionFactory().getCurrentSession().createQuery(query.toString());

List<ProAsset> proassets = q.list();

もちろん、リファクタリングの変更もいくつか行いましたが、主な変更は上記のとおりです。でもご回答ありがとうございます!

于 2012-08-08T15:03:06.440 に答える