Des requêtes HQL à l'aide de HibernateTemplate (Printemps)
C'est mon premier post, donc s'il vous plaît garder avec moi. Je suis en train d'exécuter une requête HQL de l'intérieur d'une méthode à l'aide de HibernateTemplate. La raison pour laquelle je suis en train de faire de cette façon est parce que le tableau a beaucoup plus de colonnes, mais je ne suis intéressé que dans deux. Le résultat de la requête est utilisé dans l'exécution de updateOrSave opération plus tard.
Donc de la structure de classe ressemble à:
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));
...
...
}
}
Lorsque j'exécute le code suivant exception se produit:
Caused by: org.hibernate.hql.ast.QuerySyntaxException: RATINGS is not mapped [SELECT new Temp(AVG(RATING), COUNT(*)) FROM RATINGS WHERE ADVENTURE_ID = ?]
J'ai déjà plein soufflé de mapping hibernate mapping pour le tableau des indices:
<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>
Maintenant, je comprends que j'ai besoin pour effectuer une sorte de cartographie soit dans le hibernate.hbm.xml fichiers ou de fournir de l'annotation pour le Temp de classe de la carte de la notation de la table. Je me demandais si il existe un autre moyen de contourner le problème. J'ai pensé que si vous utilisez de la Session.createSqlQuery(....) ensuite, vous pouvez ajouter des entités qui peut permettre de contourner le problème. Mais je ne suis pas sûr qu'il existe un moyen de le faire HibernateTemplate.
Toute aide/les pointeurs sont grandement appréciés.
Vous devez vous connecter pour publier un commentaire.
Code n'est pas testé, mais je pense que vous voulez dire quelque chose comme cela. Créer le SQLQUery, et de définir les scalaires comme des Chaînes de caractères, et l'utilisation de la getHibernateTemplate().execute() de la fonction.
Si c'est HQL et getHibernateTemplate().trouver ce que vous souhaitez utiliser, puis utiliser "select ... from com.xyz.abc.dao.mise en veille prolongée.Les cotes"
HibernateTemplate.find()
ne prend pas de requête SQL, en prend requête HQL. Aussi longtemps que vous pouvez exprimer votre requête HQL en serait mieux de le faire.Sinon, vous devez utiliser
Session.createSqlQuery()
à l'intérieur d'un callback passé àHibernateTemplate.executeFind()
.Voir aussi: