这是我的第一篇文章,所以请多多包涵。我正在尝试从使用 HibernateTemplate 的方法中执行 HQL 查询。我这样做的原因是因为实际的表有更多的列,但我只对两个感兴趣。查询的结果用于稍后执行 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 文件中执行某种映射,或者为 Temp 类提供注释以映射 RATINGS 表。我想知道是否有任何其他方法可以解决这个问题。我想如果你使用 Session.createSqlQuery(....) 那么你可以向它添加可以规避问题的实体。但我不确定在 HibernateTemplate 中有没有办法做到这一点。
非常感谢任何帮助/指针。