Grails / Hibernate - 通过两个子记录获取主数据的标准

时间:2013-07-30 08:20:40

标签: hibernate grails gorm grails-2.0

对于以下域类。

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

class Book {
    int serialNumber;
    String name;
}

我想得到作者,

  1. first(serialNumber = 1)book是“ABC”(名称)AND
  2. 秒(serialNumber = 2)书是“XYZ”(姓名)
  3. 即使有符合条件的数据,下面的代码也不起作用

    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的解决方案,请引导我找到正确的方向。

3 个答案:

答案 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'])
  }
}