Skip to content

Commit 4a9b813

Browse files
GRAILS-6574 - improve the handling of parameters passed to named queries along with an additional criteria closure
1 parent 888b94a commit 4a9b813

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/java/org/codehaus/groovy/grails/orm/hibernate/cfg/HibernateNamedQueriesBuilder.groovy

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,15 @@ class NamedCriteriaProxy {
124124
if (params && params[-1] instanceof Closure) {
125125
def additionalCriteriaClosure = params[-1]
126126
params = params.length > 1 ? params[0..-2] : [:]
127+
if(params) {
128+
if(params[-1] instanceof Map) {
129+
if(params.length > 1) {
130+
namedCriteriaParams = params[0..-2] as Object[]
131+
}
132+
} else {
133+
namedCriteriaParams = params
134+
}
135+
}
127136
list(params, additionalCriteriaClosure)
128137
}
129138
else {

src/test/org/codehaus/groovy/grails/orm/hibernate/NamedCriteriaTests.groovy

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,68 @@ class Publication {
256256
assertNotNull publicationClass.publishedAfter(now - 5).publicationsWithBookInTitle().get(newPaperBackWithBookInTitleId)
257257
}
258258

259+
void testPassingParamsAndAdditionalCriteria() {
260+
def publicationClass = ga.getDomainClass("Publication").clazz
261+
def now = new Date()
262+
263+
6.times { cnt ->
264+
assert publicationClass.newInstance(title: "Some Old Book #${cnt}",
265+
datePublished: now - 1000, paperback: true).save(failOnError: true).id
266+
assert publicationClass.newInstance(title: "Some New Book #${cnt}",
267+
datePublished: now, paperback: true).save(failOnError: true).id
268+
}
269+
270+
def results = publicationClass.publishedAfter(now - 5) {
271+
eq 'paperback', true
272+
}
273+
assertEquals 6, results?.size()
274+
275+
results = publicationClass.publishedAfter(now - 5, [max: 2, offset: 1]) {
276+
eq 'paperback', true
277+
}
278+
assertEquals 2, results?.size()
279+
280+
results = publicationClass.publishedBetween(now - 5, now + 1) {
281+
eq 'paperback', true
282+
}
283+
assertEquals 6, results?.size()
284+
285+
results = publicationClass.publishedBetween(now - 5, now + 1, [max: 2, offset: 1]) {
286+
eq 'paperback', true
287+
}
288+
assertEquals 2, results?.size()
289+
290+
results = publicationClass.publishedAfter(now - 1005) {
291+
eq 'paperback', true
292+
}
293+
assertEquals 12, results?.size()
294+
295+
results = publicationClass.publishedAfter(now - 5) {
296+
eq 'paperback', false
297+
}
298+
assertEquals 0, results?.size()
299+
300+
results = publicationClass.publishedAfter(now - 5, [max: 2, offset: 1]) {
301+
eq 'paperback', false
302+
}
303+
assertEquals 0, results?.size()
304+
305+
results = publicationClass.publishedBetween(now - 5, now + 1) {
306+
eq 'paperback', false
307+
}
308+
assertEquals 0, results?.size()
309+
310+
results = publicationClass.publishedBetween(now - 5, now + 1, [max: 2, offset: 1]) {
311+
eq 'paperback', false
312+
}
313+
assertEquals 0, results?.size()
314+
315+
results = publicationClass.publishedAfter(now - 1005) {
316+
eq 'paperback', false
317+
}
318+
assertEquals 0, results?.size()
319+
}
320+
259321
void testChainingNamedQueries() {
260322
def publicationClass = ga.getDomainClass("Publication").clazz
261323

0 commit comments

Comments
 (0)