Grails findAll在集合中找不到值

时间:2019-05-14 09:02:04

标签: grails

我有一个名为Planning的域,其中包含hasMany另一个包含Employee的域。我正在尝试查找所有这些计划,其中这些计划包含特定的员工,但我无法使其正常工作。

我正在尝试这样做,我的打印语句确实将contains打印为真

plannings = plannings.findAll{planning->
  if(employee) {
    log.info("find plannings with employee ${employee} ${planning.employees.contains(employee)}")
    planning.employees.contains(employee)
  }
}

我不是作为Hibernate查询来执行此操作,因为这以另一种奇怪的方式破坏了应用程序。这段代码是在for each中执行的,无论出于何种原因,都会导致Hibernate发生一些奇怪的行为。

2 个答案:

答案 0 :(得分:1)

闭包必须返回<div align="center">值-请参见http://docs.groovy-lang.org/latest/html/groovy-jdk/java/util/Collection.html#findAll(groovy.lang.Closure)

这应该有效(未经测试):

boolean

顺便说一句:我不会将过滤后的列表分配给原始 plannings = plannings.findAll{planning-> planning.employees?.contains(employee)} 列表。提取一个新的表达变量,例如plannings或类似的变量。

答案 1 :(得分:1)

没有关于您的问题的更多相关详细信息(奇怪的行为是什么?日志跟踪?休眠映射?等),我们所能做的只是推测;如果必须这样做,我很可能会这样说:

  1. 您用于比较的employee对象是一个分离的对象。
  2. employee对象不会有意义地覆盖equalshashCode
  3. 您使用detached employeeemployees内的persisted planning.employees.contains(employee)(使用planning)进行比较>

在这些情况下,即使比较可能代表相同的对象,它们也永远不会是正确的。如果是这种情况,您必须:

  1. 使用持久的employee对象进行比较。
  2. 或者,implement equals and hashCode在语义上对Employee有意义

希望这会有所帮助。