0

我不知道这个查询是否可以使用 grails executeQuery。我制作了一个域类示例:

class Child {
    String firstName
    String lastName
    String nickName
}

这是我的引导带:

class BootStrap {

def init = { servletContext ->

    def childOne = new Child(firstName: 'Poliwag', lastName:'Wrath', nickName: 'taurus')
    def childTwo = new Child(firstName: 'Poliwarp', lastName: 'Wrath', nickName:'libra')
    def childThree = new Child(firstName: 'Poliwag', lastName: 'Wrath',nickName:'aries')
    def childFour = new Child(firstName: 'Poliwag', lastName: 'Wrath',nickName:'virgo')

    childOne.save(flush: true, failOnError: true)
    childTwo.save(flush: true, failOnError: true)
    childThree.save(flush: true, failOnError: true)
    childFour.save(flush: true, failOnError: true)        
    }

}

如您所见,我有 2 个示例数据条目,它们具有相同的firstNamelastName属性,它们仅在nickName属性上有所不同。我想在executeQuery中得到一个条目列表,其名字姓氏属性与另外 2 个条目相同。是否可以在 grails executeQuery中使用带有 count(...) 的运算符?我认为这是使用动态查找器的等效代码:

def list = []
def c = Child.countByFirstNameAndLastName('Poliwag',Wrath)
if (c == 2) {
    list.add(Child.findByFirstNameAndLastName('Poliwag','Wrath'))
}

如果可能的话,我认为如果我使用executeQuery它将节省更多的代码行。谢谢..

4

3 回答 3

2

如果昵称和姓氏是固定值,就像在您的示例中一样,您可以在 executeQuery 中使用常规 WHERE 条件和 SELECT COUNT,这与您使用的 countBy 方法相同。

但如果这些值不固定,您可以使用 GROUP BY 和 HAVING 来完成此操作。但是这样你就不能返回整个对象,只能返回你分组的属性:

def c = Child.executeQuery("select new map(c.firstname as firstname, c.lastname as lastname) from Child c group by c.firstname, c.lastname having count(c.firstname) = 2")

您可以像这样遍历结果映射:

c.each{
    println it.firstname + " " + it.lastname
}
于 2012-09-11T10:12:37.173 回答
1

你可以通过做这样的事情来实现它。

def x = Child.executeQuery("select c1 from Child c1,Child c2 where c1.firstName=c2.firstName and c1.nickName<>c2.nickName")

println x.size()
于 2012-09-11T13:38:09.830 回答
0
def x = Child.executeQuery("select count (*) from Child c1,Child c2 where c1.firstName=c2.firstName and c1.nickName<>c2.nickName")

println x[0]
于 2015-03-02T16:04:10.977 回答