我有看起来像这样的查询:

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而不使用其他任何东西,但您可能还会问到如何用螺丝刀以外的任何东西盖房子,而最好的答案仍然是“购买其他工具”)。

07-25 23:55
查看更多