gpt4 book ai didi

hibernate - 从 Grails 中域对象的子属性列表创建对子属性的属性进行操作的条件限制

转载 作者:行者123 更新时间:2023-12-02 14:41:38 24 4
gpt4 key购买 nike

我有一个名为 Person 的 Groovy 类, with 有一个称为 identities 的一对多关联。 ,其中每个元素都是 Identity 的一个实例类(class)。 Identity类有一个名为 channel 的属性,它有一个名为 channelName 的属性.这是一个精简的示例:

class Person {
static hasMany = [identities: Identity]

String username
String firstName
String lastName
...
}

class Identity {
Channel channel

...
}

class Channel {
String channelName

...
}

有一种方法可以根据传入的参数动态建立标准,以搜索人员。一个精简的例子:
Person[] findPeople(String username, String channelName, int limit) {
return buildCriteria(username, channelName).list(max: limit) {
order('lastName')
order('firstName')
}
}
buildCriteria方法如下所示:
private DetachedCriteria<Person> buildCriteria(String username, String channelName) {
def criteria = Person.where { }

if(username) {
criteria = criteria.where {
eq('username', username)
}
}

if(channelName) {
criteria = criteria.where {
identities {
eq('channel.channelName', channelName)
}
}
}

return criteria
}

如果 channelName是传入的,我想得到一个 Person如果该人的任何身份具有其 channelName 的 channel ,则记录回属性与传入的属性匹配。我为此编写了一个单元测试,一切似乎都按预期工作,我得到了预期的结果。测试能够成功解析 'channel.channelName' .但是当我实际上最终在运行时使用该方法时(它通过 Controller 端点调用),我看到以下错误:
could not resolve property: channel.channelName of: com.example.domain.Identity

我能看到的唯一区别是在单元测试环境中, Channel , Person , 和 Identity被 mock 。但我不明白为什么这会导致行为如此不同。我有两个问题:
  • Groovy 如何在测试环境中解析属性,但在实际运行时不能解析?
  • 这是从子属性列表(在父对象上)查询子属性的属性的正确方法吗?如果没有,正确的方法是什么?
  • 最佳答案

    AFAIK 正确的方法是 channel { eq('channelName', channelName) }但也许在分离标准(我通常不使用它们)或 Grails 的较新版本中,点语法也适用。

    无论如何,我试图在我拥有的类似域类层次结构中重现您的问题,并使用 where 发现非常奇怪的结果。方法。检查 MySQL 查询日志,我可以看到最内部的查询(在您的情况下是 eq('channel.channelName', channelName) )被完全忽略,即使更改为 channel { eq('channelName', channelName) } .

    更改 where { ... }.list([max:10])createCriteria().list([max:10])解决了。但是,它不使用分离的标准。

    无论如何,以下内容对我有用,并且避免了附加标准的需要。

    List<People> findPeople(String username, String channelName, int limit) {
    People.createCriteria().list(max: limit) {
    with(buildCriteria(username, channelName))
    order('lastName')
    order('firstName')
    }
    }

    private Closure buildCriteria(String username, String channelName) {
    return {
    if(username) {
    eq('username', username)
    }
    if(channelName) {
    identities {
    channel {
    eq('channelName', channelName)
    }
    }
    }
    }
    }

    我喜欢这种创建标准的方式是它与以后执行的方式无关。无论是 Hibernate Criteria 还是 Grails 分离的标准,您都会得到一个与标准 Hook 的闭包。它还允许您非常轻松地编写标准,因为您可以应用任意数量的闭包。

    我知道它并不能真正回答您的问题,但也许您可以试一试,并将结果与​​您当前的结果进行比较。你可能会从中得到一些线索。

    关于hibernate - 从 Grails 中域对象的子属性列表创建对子属性的属性进行操作的条件限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31753539/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com