В Grails 2.5.4 у меня возникают проблемы с использованием дизъюнкции в подзапросах. Если у меня есть запрос вроде следующего:Использование дизъюнкции (логическое или) в подзаголовках Grails
DomainObj.createCriteria().list {
def criteria = new DetachedCriteria(DomainObj2).build {
or {
eq('prop1', someVal)
eq('prop2', someVal)
eq('prop3', someVal)
}
projections {
distinct('id')
}
}
inList('prop', criteria)
}
«или» часть запроса завершается с нулевым указателем исключения. Причина заключается в том, что в AbstractHibernateCriterionAdapter код ищет PersistentEntity для DetachedCriteria, который никогда не назначается.
Единственный способ решения проблемы я нашел, чтобы переключить запрос использовать больше подзапросы, как это:
def criteria1 = new DetachedCriteria(DomainObj2).build {
eq('prop1', someVal)
projections {
distinct('id')
}
}
def criteria2 = new DetachedCriteria(DomainObj2).build {
eq('prop2', someVal)
projections {
distinct('id')
}
}
def criteria3 = new DetachedCriteria(DomainObj2).build {
eq('prop3', someVal)
projections {
distinct('id')
}
}
DomainObj.createCriteria().list {
or {
inList('prop', criteria1)
inList('prop', criteria2)
inList('prop', criteria3)
}
}
Что обходит проблему, и на самом деле не является идеальным. Любая идея, что происходит не так?
Update
Так осмотрев еще немного я нашел this issue на Github. То, что я испытываю, является ошибкой, которая была исправлена в grails-data-mapping версии 5.0.2. Поэтому для тех, кто ищет эту проблему в будущем, похоже, что вам либо нужно обновить, либо использовать сумасшедший обходной путь, выделенный выше.
Что вы пытаетесь сделать? – injecteer