Это мое первое сообщение, поэтому, пожалуйста, несите меня. Я пытаюсь выполнить запрос HQL из метода, используя HibernateTemplate. Причина, по которой я делаю этот путь, состоит в том, что фактическая таблица имеет гораздо больше столбцов, но меня интересуют только две. Результат запроса используется при выполнении операции updateOrSave позже.Запросы HQL с использованием HibernateTemplate (Весна)
Так классовая структура выглядит следующим образом:
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 = ?]
У меня уже есть полномасштабное отображение отображения спящего режима для таблицы оценок:
<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.
Любая помощь/указатели с большой благодарностью.
Хотя это решает проблему, я пытался избежать этого беспорядочного способа сделать это и хотел, чтобы это было просто, используя HQL. Я предполагаю, что другой из них будет состоять в том, чтобы создавать представления и сопоставлять класс с этим видом, который снова несколько более беспорядочен. – n00bc0der