对于以下域类。
class Author {
String name;
static hasMany=[books:Book]
}
class Book {
int serialNumber;
String name;
}
我想得到作者,
即使有符合条件的数据,下面的代码也不起作用
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的解决方案,请引导我找到正确的方向。
答案 0 :(得分:3)
我害怕(不是100%肯定)Criteria语法只能查询单个子记录,所以你必须使用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 = a
替换from a.books as b2
- 我现在无法测试它。
答案 1 :(得分: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或其他方法。
答案 2 :(得分:0)
使用“inList”
Collection<Author> authors = Author.createCriteria().list {
books {
inList('serialNumber', [1L, 2L])
inList('name', ['A', 'B'])
}
}