Skip to content

Commit 2e7764a

Browse files
rjpereshazzik
authored andcommitted
NH-3710 - Can SetLockMode on DetachedCriteria
1 parent 71994bd commit 2e7764a

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

src/NHibernate.Test/Criteria/CriteriaQueryTest.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2983,5 +2983,27 @@ public void IgnoreCase()
29832983
t.Commit();
29842984
}
29852985
}
2986+
2987+
[Test]
2988+
public void CanSetLockModeOnDetachedCriteria()
2989+
{
2990+
//NH-3710
2991+
var dc = DetachedCriteria
2992+
.For(typeof(Student))
2993+
.SetLockMode(LockMode.Upgrade);
2994+
2995+
using (var session = OpenSession())
2996+
using (var tx = session.BeginTransaction())
2997+
{
2998+
session.Save(new Student { Name = "Ricardo Peres", StudentNumber = 666, CityState = new CityState("Coimbra", "Portugal") });
2999+
session.Flush();
3000+
3001+
var ec = dc.GetExecutableCriteria(session);
3002+
var countExec = CriteriaTransformer.TransformToRowCount(ec);
3003+
var countRes = countExec.UniqueResult();
3004+
3005+
Assert.AreEqual(countRes, 1);
3006+
}
3007+
}
29863008
}
29873009
}

src/NHibernate/Loader/Criteria/CriteriaLoader.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,20 +165,25 @@ protected override SqlString ApplyLocks(SqlString sqlSelectString, IDictionary<s
165165
return sqlSelectString;
166166
}
167167

168-
Dictionary<string, LockMode> aliasedLockModes = new Dictionary<string, LockMode>();
168+
//Dictionary<string, LockMode> aliasedLockModes = new Dictionary<string, LockMode>();
169169
Dictionary<string, string[]> keyColumnNames = dialect.ForUpdateOfColumns ? new Dictionary<string, string[]>() : null;
170170
string[] drivingSqlAliases = Aliases;
171-
for (int i = 0; i < drivingSqlAliases.Length; i++)
171+
172+
//NH-3710: if we are issuing an aggregation function, Aliases will be null
173+
if (drivingSqlAliases != null)
172174
{
173-
LockMode lockMode;
174-
if (lockModes.TryGetValue(drivingSqlAliases[i], out lockMode))
175+
for (int i = 0; i < drivingSqlAliases.Length; i++)
175176
{
176-
ILockable drivingPersister = (ILockable) EntityPersisters[i];
177-
string rootSqlAlias = drivingPersister.GetRootTableAlias(drivingSqlAliases[i]);
178-
aliasedLockModes[rootSqlAlias] = lockMode;
179-
if (keyColumnNames != null)
177+
LockMode lockMode;
178+
if (lockModes.TryGetValue(drivingSqlAliases[i], out lockMode))
180179
{
181-
keyColumnNames[rootSqlAlias] = drivingPersister.RootTableIdentifierColumnNames;
180+
ILockable drivingPersister = (ILockable)EntityPersisters[i];
181+
string rootSqlAlias = drivingPersister.GetRootTableAlias(drivingSqlAliases[i]);
182+
//aliasedLockModes[rootSqlAlias] = lockMode;
183+
if (keyColumnNames != null)
184+
{
185+
keyColumnNames[rootSqlAlias] = drivingPersister.RootTableIdentifierColumnNames;
186+
}
182187
}
183188
}
184189
}

0 commit comments

Comments
 (0)