7

次のドメイン オブジェクトがあります。

class User {
    String name
    Transaction transaction

    static constraints = {
        transaction nullable: true
    }
}

class Transaction {        
    boolean successful
    User user        
    static belongsTo = User
}

usersトランザクションが成功していないものをすべて選択したい。これは、トランザクションのないユーザー ( transaction == null) と、値が成功したトランザクションを持つユーザーfalse( ) が必要であることを意味しますtransaction.successful == false。これを Criteria API で実行したいと考えています (これは、ユーザー入力に基づいて他の条件と組み合わせることができるためです)。

私はこれを試しました:

def c = User.createCriteria()
def results = c {
    or {
        isNull 'transaction'
        transaction {
            eq 'successful', false
        }
    }
}

ただし、これにより、トランザクション (成功した値を持つfalse) を持つユーザーのみが得られます。しかし、トランザクションがあるユーザーを取得できませんnull

次のコードは、サンプル データの作成方法を示しています。

def createUserAndTransaction(String name, Boolean successful = null) {
    User u = new User(name: name)
    if (successful != null) {
        Transaction t = new Transaction(user: u, successful: successful)
        u.setTransaction(t)
    }
    u.save()
}

def init = { servletContext ->
    createUserAndTransaction 'john', true
    createUserAndTransaction 'mike', false
    createUserAndTransaction 'pablo'
}

私の基準クエリはmike、この場合にのみ返されます。しかし、私は欲しいmikeですpablo。私は何が欠けていますか?

4

1 に答える 1

10

問題は、デフォルトで内部結合になることです。テーブルのエイリアスを作成し、その結合タイプを定義する必要があります。

createAlias("transaction", "t", CriteriaSpecification.LEFT_JOIN)

or {
    isNull("t")
    eq("t.successful", false)
}
于 2013-01-21T23:21:48.623 に答える