0

这是我的第一篇文章,所以请多多包涵。我正在尝试从使用 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 中有没有办法做到这一点。

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

4

2 回答 2

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().find 你想用的,然后使用 "select ... from com.xyz.abc.dao.hibernate.Ratings"

于 2012-04-12T20:35:04.393 回答
1

HibernateTemplate.find()不采用 SQL 查询,采用 HQL 查询。只要您可以在 HQL 中表达您的查询,这样做会更好。

否则,您需要Session.createSqlQuery()在传递给的回调中使用HibernateTemplate.executeFind().

也可以看看:

于 2012-04-12T20:31:48.937 回答