0

对于下面的域类。

class Author {
    String name;
    static hasMany=[books:Book]
}

class Book {
    int serialNumber;
    String name;
}

我想得到作者的,

  1. 第一(序列号=1)书是“ABC”(名称)和
  2. 第二(序列号=2)书是“XYZ”(名称)

即使有符合条件的数据,下面的代码也不起作用

def c = Author.createCriteria()
def results = c.list {
    books {
        and {
            and {
                eq("serialNumber", 1)
                eq("name", 'ABC')
            }
            and {
                eq("serialNumber", 2)
                eq("name", 'XYZ')
            }
        }
    }
}

我只有 SQL 的基本知识,所以如果您建议任何基于 SQL 的解决方案,请指导我正确的方向。

4

3 回答 3

3

恐怕(不是 100% 确定)条件语法只能查询单个子记录,因此您必须使用 HQL,例如:

from Author as a
where exists (
  from Book as b1 where b1.author = a and b1.serialNumber = 1 and b1.name = 'ABC'
)
and exists (
  from Book as b2 where b2.author = a and b2.serialNumber = 2 and b1.name = 'XYZ'
)

也许您可以替换from Book as b2 where b2.author = afrom a.books as b2- 我现在无法测试它。

于 2013-07-30T08:49:22.333 回答
2

首先,那些和是多余的,因为你的代码相当于

def c = Author.createCriteria()
def results = c.list {
    books {
        eq("serialNumber", 1)
        eq("name", 'ABC')
        eq("serialNumber", 2)
        eq("name", 'XYZ')
    }
}

这个比较好理解,意思是“找到同时拥有序号为1和2,同时名字为ABC和XYZ的书的作者”,当然不会返回任何东西。

我怀疑您的模型允许使用标准进行此类查询,因此我建议使用 HQL 或其他方式。

于 2013-07-30T09:58:06.197 回答
0

使用“列表”

Collection<Author> authors = Author.createCriteria().list {
  books {
     inList('serialNumber', [1L, 2L])
     inList('name', ['A', 'B'])
  }
}
于 2013-09-19T11:35:43.080 回答