使用HibernateTemplate进行HQL查询(Spring)

时间:2012-04-12 20:17:33

标签: spring hibernate hql

这是我的第一篇文章,请耐心等待。我正在尝试使用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中是否有办法做到这一点。

非常感谢任何帮助/指示。

2 个答案:

答案 0 :(得分:1)

在进行HQL查询时,

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”