0

grailsexecuteQueryを使用してこのクエリが可能かどうかはわかりません。サンプルをドメインクラスにしました:

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)        
    }

}

お気づきのとおり、 firstNameプロパティとlastNameプロパティが同じ2つのサンプルデータエントリがありますが、 nickNameプロパティのみが異なります。executeQueryで取得したいのは、 firstNamelastNameのプロパティが別の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メソッドと同じです。

ただし、これらの値が固定されていない場合は、GROUPBYおよび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 に答える