0

これは私の最初の投稿ですので、ご容赦ください。HibernateTemplateを使用してメソッド内からHQLクエリを実行しようとしています。私がこのようにしている理由は、実際のテーブルにはさらに多くの列があるためですが、関心があるのは2つだけです。クエリの結果は、後でupdateOrSave操作を実行する際に使用されます。

したがって、クラス構造は次のようになります。

class XYZDAO {
   ...
   ...

   public void createReview(....) {
      ...
      ...
      class Temp {
        private final float rating;
        private final int count;

        @SuppressWarnings("unused")
        public Temp(float rating, int count)
        {
            this.rating = rating;
            this.count = count;
        }
        public float getRating()
        {
            return rating;
        }
        public int getCount()
        {
            return count;
        }          
      }
      List<Temp> avgRatingWrapper = getHibernateTemplate().find("SELECT new Temp(AVG(RATING), COUNT(*)) FROM RATINGS WHERE ADVENTURE_ID = ?", Integer.parseInt(adventureId));
      ...
      ...
   }
}

コードを実行すると、次の例外が発生します。

Caused by: org.hibernate.hql.ast.QuerySyntaxException: RATINGS is not mapped [SELECT new Temp(AVG(RATING), COUNT(*)) FROM RATINGS WHERE ADVENTURE_ID = ?]

私はすでにRATINGSテーブルの本格的なマッピング休止状態マッピングを持っています:

<hibernate-mapping>
    <class name="com.xyz.abc.dao.hibernate.Ratings" table="ADV_ADMN.RATINGS">
        <id name="id" type="int" column="ID">
            <generator class="seqhilo">
                <param name="sequence">ADV_ADMN.RATINGS_ID_SEQ</param>
                <param name="allocationSize">1</param>
            </generator>
        </id>
        <version name="timestamp" type="timestamp">
            <column name="TIMESTAMP" length="19" not-null="true" />
        </version>
        <property name="adventureId" type="int">
            <column name="ADVENTURE_ID" not-null="true" />
        </property>
        <property name="reviewer" type="string">
            <column name="REVIEWER" length="45" not-null="true" />
        </property>
        <property name="rating" type="java.lang.Float">
            <column name="RATING" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

これで、hibernate.hbm.xmlファイルで何らかのマッピングを実行するか、RATINGSテーブルをマップするためにTempクラスに注釈を付ける必要があることを理解しました。問題を回避する他の方法があるかどうか疑問に思いました。Session.createSqlQuery(....)を使用すると、問題を回避できるエンティティを追加できると思いました。しかし、HibernateTemplateでそれを行う方法があるかどうかはわかりません。

ヘルプ/ポインタは大歓迎です。

4

2 に答える 2

1

HibernateTemplate.find()SQLクエリを取りません。HQLクエリを取ります。クエリをHQLで表現できる限り、そうするほうがよいでしょう。

Session.createSqlQuery()それ以外の場合は、に渡されるコールバック内で使用する必要がありますHibernateTemplate.executeFind()

参照:

于 2012-04-12T20:31:48.937 に答える
1

コーディングはテストされていませんが、このような意味だと思います。SQLQUeryを作成し、スカラーを文字列として定義し、getHibernateTemplate()。execute()関数を使用します。

return getHibernateTemplate().execute(new HibernateCallback<List>() {

        public String doInHibernate(Session s)
                throws HibernateException, SQLException {
            SQLQuery sql=s.createSQLQuery("SELECT AVG(RATING) as r, COUNT(*) as c FROM RATINGS WHERE ADVENTURE_ID = ?");
                sql.setParameter(0, adventureId);
            sql.addScalar("r");
            sql.addScalar("c");
            return sql.list();
        }
    });

HQLでgetHibernateTemplate()。を使用する場合は、「select ...fromcom.xyz.abc.dao.hibernate.Ratings」を使用します。

于 2012-04-12T20:35:04.393 に答える