2010-07-26 6 views
1

hier j'ai essayé de faire ce travail de code inspite le fait qu'il est juste fonctionne très bien avec nhibrnate et le serveur SQL, mais quand il vient à Oracle il générer mal sqlNhibernate Generat mal SQL pour Oracle avec verrouillage

UnitOfWork.Current.CreateCriteria<Bill>().Add(Restrictions.IsEmpty("ReqId")) 
.SetMaxResults(BatchSize).SetLockMode(LockMode.Upgrade).List<Bill>(); 

le SQL généré quelque chose comme

Select * from 
(Select bill_0.id,bill_0.BillNo ...... from Bill bill_0 where bill_0.reqId is Not null) 
where ROWNUM < 10 for UPDATE of bill_0.ID 

donc je ne vais pas courir parce que les alliés bill_o est défini dans l'instruction sql intérieure qui a obtenu la sorte solution?

SQL correcte serait quelque chose comme ce que j'ai essayé et travaillé sur Oracle db

Select bill_0.id,bill_0.BillNo ...... from Bill bill_0 
where bill_0.reqId is Not null and ROWNUM < 10 for UPDATE of bill_0.ID 
+0

Veuillez nous indiquer l'avantage d'utiliser le verrouillage ici. Selon NH Docs "les utilisateurs avancés peuvent parfois souhaiter obtenir des verrous pessimistes exclusifs" Alors, comment cela est utile ici. Aussi, il vaudrait mieux ajouter le SQL attendu à générer. –

+0

simplement pour empêcher d'autres threads de mettre à jour mon jeu d'enregistrements – BigOmar

Répondre

1

Depuis, comme vous le dites, NHibernate génère pas valide Oracle SQL, je vous suggère de déposer un bug avec le peuple NHibernate . Le SQL fonctionnerait si un alias de "bill_0" avait été affecté à la vue en ligne, ou si la clause FOR UPDATE n'utilisait pas d'alias de table ("for UPDATE of ID"). Si vous pouvez modifier vos appels NHibernate pour faire l'un de ces événements, je crains d'en avoir aucune idée.

+0

Je suppose que c'est un bug j'espère que c'est fixé à Nhibernate 3 – BigOmar