Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Grails或Hibernate中缩短此时间_Java_Hibernate_Spring_Grails_Groovy - Fatal编程技术网

Java 如何在Grails或Hibernate中缩短此时间

Java 如何在Grails或Hibernate中缩短此时间,java,hibernate,spring,grails,groovy,Java,Hibernate,Spring,Grails,Groovy,我有一个类似这样的查询: SomeDomain.executeQuery(""" from SomeDomain x where x.linkToSomeA = coalesce(:a, x.linkToSomeA) and x.linkToSomeB = coalesce(:b, x.linkToSomeB) and ... """, [a: someA, b: someB, ...] ) def

我有一个类似这样的查询:

SomeDomain.executeQuery("""
    from
        SomeDomain x
    where
        x.linkToSomeA = coalesce(:a, x.linkToSomeA) and
        x.linkToSomeB = coalesce(:b, x.linkToSomeB) and
        ...
    """,
    [a: someA, b: someB, ...]
)
def query = [
    'a': 'x.linkToSomeA = :a',
    'b': 'x.linkToSomeB = :b'
].findAll{ k, q -> params[k] != null }.values().join(' and ')

SomeDomain.executeQuery("""
    from
        SomeDomain x
    where
        ${query}
    """,
    params
)
预期行为如下:一旦为标准参数提供了
null
,则应忽略此标准。如果提供的不是
null
,则使用该标准

除了Hibernate不允许在需要域类实例的地方提供
null
之外,一切都可以正常工作。因此,最终这不是一个有效的查询(事实上,如果提供了任何
null
s,将抛出
NullPointerException

如果不使用大量的
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
的要求,但你也可能会问如何只用螺丝刀建造房子,最好的答案仍然是“买一些其他工具”).

这通常是针对使用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));
}
// ...

这个答案并不符合你的要求,即除了使用EXECUTEQUY之外不要使用任何东西,但你也可能会问如何使用螺丝刀来建造房子,最好的答案仍然是“买一些其他工具”)。

我想知道你是否可以使用地图和
findAll()
,比如:

SomeDomain.executeQuery("""
    from
        SomeDomain x
    where
        x.linkToSomeA = coalesce(:a, x.linkToSomeA) and
        x.linkToSomeB = coalesce(:b, x.linkToSomeB) and
        ...
    """,
    [a: someA, b: someB, ...]
)
def query = [
    'a': 'x.linkToSomeA = :a',
    'b': 'x.linkToSomeB = :b'
].findAll{ k, q -> params[k] != null }.values().join(' and ')

SomeDomain.executeQuery("""
    from
        SomeDomain x
    where
        ${query}
    """,
    params
)
这将返回在params映射中具有非null参数的所有查询元素的列表(应将其更改为匹配查询中使用的映射)。这是一个简单的工作,根据主映射的“键”进行过滤,然后将值与
连接起来


注意,有一个潜在的问题,那就是如果根本没有参数。在这种情况下,您需要检查
query
是否为非空,或者提供一个回退方法。

我想知道您是否可以使用map和
findAll()
,如下所示:

SomeDomain.executeQuery("""
    from
        SomeDomain x
    where
        x.linkToSomeA = coalesce(:a, x.linkToSomeA) and
        x.linkToSomeB = coalesce(:b, x.linkToSomeB) and
        ...
    """,
    [a: someA, b: someB, ...]
)
def query = [
    'a': 'x.linkToSomeA = :a',
    'b': 'x.linkToSomeB = :b'
].findAll{ k, q -> params[k] != null }.values().join(' and ')

SomeDomain.executeQuery("""
    from
        SomeDomain x
    where
        ${query}
    """,
    params
)
这将返回在params映射中具有非null参数的所有查询元素的列表(应将其更改为匹配查询中使用的映射)。这是一个简单的工作,根据主映射的“键”进行过滤,然后将值与
连接起来


注意,有一个潜在的问题,那就是如果根本没有参数。在这种情况下,您需要检查
query
是否为非空,或者是否提供了回退方法。

问题是我上次检查时,由于存在错误,无法使用条件。但也许你是对的,真的没有办法。问题是上次我检查时,因为一个bug,我无法使用标准。但也许你是对的,真的没有办法。