Hibernate requête select avec différents clause where
Cela peut être assez simple, mais j'ai passé des heures sur Google mais impossible de trouver une réponse pertinente.
Je suis en train de mettre au-dessous de la logique en hibernation, mais je ne suis pas en mesure de comprendre comment.
C'est ma configuration: base de données Mysql avec 2 tables T1(ID,C1,C2) et T2(colonne1,colonne2,colonne3).
C'est ce que je veux mettre en œuvre
results = select ID, from T1 //This will result in multiple rows.
for(eachRow in results )
{
select column1,column2,column3 from T2 where ID=eachRow.ID
//Do some computation like
//Assign value of table "T1" column "C1" to table "T2" column "column1"
column1 = eachRow.C1
}
Pour l'instant, je pense à une logique de la lecture de l'ensemble de la table à l'aide de la veille prolongée "de la" clause dans une Liste et d'une itération à travers elle. Cependant, cela peut provoquer un dépassement de mémoire exception. Pourriez-vous s'il vous plaît suggérer comment le HQL doit être?
C'est ce que j'ai fait
Session session = HibernateSession.getSessionFactory().openSession();
Transaction aTableTx = null;
try {
aTableTx = session.beginTransaction();
_allRows = session.createQuery("from T1").list();
for (Iterator<T1> iterator = _allRows.iterator(); iterator.hasNext();)
{
T1 aRow = iterator.next();
//Here I am planning to run a similar to
//_allRows = session.createQuery("from T2").list();
//Store the result and iterate through the list, but
//it is very inefficient.
}
aTableTx.commit();
- Tout d'abord, HQL ne fonctionne pas sur les tables, mais sur les entités. Montrez-nous vos entités plutôt que sur les tables.
- Je suis d'accord,j'ai mappé les tables de la classe à l'aide d'annotations. Alors maintenant, j'ai 2 classes de T1 et de T2 comment puis-je mettre la requête mysql en HQL.
- La requête HQL serait presque identique à la requête SQL. Avez-vous lu la documentation sur les requêtes HQL? Qu'avez-vous essayé?
- J'ai édité et ajouté mon code.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire défiler les résultats d'une requête, à l'aide de la
scroll()
(ouiterate()
) méthode, plutôt que de lalist()
méthode.Assurez-vous de rincer régulièrement et effacer la séance, comme expliqué dans la hibernate documentation de mises à jour par lot.
Aussi, la requête interne doit au moins avoir une clause where, comme votre pseudo de la requête SQL en a un. Les deux entités doivent probablement être associés à OneToMany ou OneToOne colonne, ce qui permettrait d'éviter la nécessité de cette requête interne complètement.
Je pense que la meilleure chose à faire serait de lire la documentation Hibernate.
Lors de l'Itération dans la table T1, vous pouvez exécuter une requête qui doit avoir une clause where dans la comme ceci: