これは私の最初の投稿ですので、ご容赦ください。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でそれを行う方法があるかどうかはわかりません。
ヘルプ/ポインタは大歓迎です。