我有看起来像这样的查询:
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
)。我没有找到任何方法来重写它,而无需使用大量的
if-else
。有谁知道如何同时做到关于简短而有效的?注意:真正的查询要比这复杂得多,因此,请不要使用
executeQuery
以外的其他任何方式重写此查询。 最佳答案
通常针对使用Criteria API的此类问题:它允许动态构建查询:
Criteria c = session.createCriteria(SomeDomain.class, "x");
if (a != null) {
c.add(Restrictions.eq("x.linkToSomeA", a));
}
if (b != null) {
c.add(Restrictions.eq("x.linkToSomeB", b));
}
// ...
该答案并不符合您的要求,即不使用
executeQuery
而不使用其他任何东西,但您可能还会问到如何用螺丝刀以外的任何东西盖房子,而最好的答案仍然是“购买其他工具”)。