У меня есть запрос, который выглядит примерно так:
SomeDomain.executeQuery("""
from
SomeDomain x
where
x.linkToSomeA = coalesce(:a, x.linkToSomeA) and
x.linkToSomeB = coalesce(:b, x.linkToSomeB) and
...
""",
[a: someA, b: someB, ...]
)
Предполагаемое поведение следующее: если для параметра критерия задано null
, этот критерий следует игнорировать. Если указано что-то отличное от null
, используется критерий.
Все будет работать нормально, за исключением того, что Hibernate не позволяет поставлять null
там, где ожидаются экземпляры класса домена. Таким образом, в конце концов, это неправильный запрос (на самом деле NullPointerException
будет выдан, если будет предоставлено null
s).
Я не нашел способа переписать это без использования тонны if-else
. Кто-нибудь знает, как сделать так, чтобы было одинаково кратким и действительным одновременно?
ПРИМЕЧАНИЕ: реальный запрос более сложен, чем этот, поэтому, пожалуйста, не предлагайте переписать его, используя что-либо еще, кроме executeQuery
.