这是我的第一篇文章,请耐心等待。我正在尝试使用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映射:
<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中是否有办法做到这一点。
非常感谢任何帮助/指示。
答案 0 :(得分:1)
HibernateTemplate.find()
不接受SQL查询。只要你能在HQL中表达你的查询就更好了。
否则,您需要在传递给Session.createSqlQuery()
的回调中使用HibernateTemplate.executeFind()
。
另见:
答案 1 :(得分: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 ... from com.xyz.abc.dao.hibernate.Ratings”