Dies ist mein erster Beitrag also bitte tragen Sie mit mir. Ich versuche, eine HQL-Abfrage innerhalb einer Methode mit HibernateTemplate auszuführen. Der Grund, warum ich so vorgehe, ist, dass die eigentliche Tabelle viel mehr Spalten hat, aber ich bin nur an zwei interessiert. Das Ergebnis der Abfrage wird später beim Ausführen von updateOrSave verwendet.HQL-Abfragen mit HibernateTemplate (Spring)
So ist die Klassenstruktur wie folgt aussieht:
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));
...
...
}
}
Wenn ich den Code folgenden Ausnahme ausgeführt auftritt:
Caused by: org.hibernate.hql.ast.QuerySyntaxException: RATINGS is not mapped [SELECT new Temp(AVG(RATING), COUNT(*)) FROM RATINGS WHERE ADVENTURE_ID = ?]
Ich habe bereits eine vollständige geblasen Mapping Hibernate Mapping für die Tabelle BEWERTUNGEN:
<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>
Jetzt verstehe ich, dass ich eine Art von Mapping entweder durchführen muss Die Dateien hibernate.hbm.xml oder Annotation für die Temp-Klasse zum Zuordnen der Tabelle RATINGS. Ich habe mich gefragt, ob es noch einen anderen Weg gibt, um das Problem zu umgehen. Ich dachte, wenn Sie Session.createSqlQuery (....) verwenden, können Sie Entitäten hinzufügen, die das Problem umgehen können. Aber ich bin mir nicht sicher, ob es einen Weg gibt, dies in HibernateTemplate zu tun.
Jede Hilfe/Zeiger werden sehr geschätzt.
Obwohl dies das Problem löst, habe ich versucht, diesen unordentlichen Weg zu vermeiden, und wollte es einfach mit HQL halten. Ich denke, das andere wäre es, Ansichten zu erstellen und eine Klasse zu dieser Ansicht zuzuordnen, die wiederum etwas unordentlicher ist. – n00bc0der