2

grails 1.3.7 を使用して、特定のドメイン クラスのインスタンスの 2 つのリストを交差させたいと考えています。

問題は、交差の結果が常に空のリストになるように、1 つのリストのインスタンスが javasisst によって作成されることです。

ここに私のドメインがあります:

class User {
    ...
    static hasMany = [foos : Foo]
    ...
} 

class Foo {
    ...
    static hasMany = [bars : Bar]
    ...
}

class Bar {
    ...
    static hasMany = [localizedTitles : LocalizedTitle]
    ...
}

Bar次のように、ユーザーのすべてのインスタンスのリストを取得します。

def allBarsOfUser = userInstance.foos.bars.flatten()

そして、Barインスタンスの別のリストと交差してみてください:

def intersectedBars = bars.intersect(allBarsOfUser)

問題は、allBarsOfUseristの要素の型と is の要素のBar_$$_javassist_139型が常にでbarsあるBarことです。intersectedBars[]

次のようにして問題を解決しましたが、解決策が気に入りません。

def allBarsOfUser = userInstance.foos.bars.flatten().collect{Bar.get(it.id)}

より良い解決策は何ですか?

Bar_$$_javassist_139正常に動作するBarようにキャストするにはどうすればintersect()よいですか?

4

1 に答える 1

1

それはあなたが実際に何をしようとしているのかによります。このintersect方法は最終的にに依存しているequalsため、実装するequalshashCode、必要な処理が実行されBarます。equalsただし、IDはオブジェクトの保存時にのみ割り当てられるため、新しく作成されたオブジェクトを以前に保存されたオブジェクトと比較することはできないため、通常はオブジェクトIDの観点から実装するべきではありません。Hibernateは、ビジネスキー(生成されたIDではないが、安定していて、オブジェクトの存続期間を通じて変更される可能性が低いもの)に基づいて実装することをお勧めします。

class UserAccount {
  String username
  String realname

  public boolean equals(that) {
    return ((that instanceof UserAccount)
        && (this.username == that.username))
  }

  public int hashCode() {
    username.hashCode()
  }
}

したがって、IDの比較が必要な場合は、明示的に行う方が明確です。

def userBarIds = allBarsOfUser*.id
def intersectedBars = bars.findAll { it.id in userBarIds }
于 2012-07-26T10:04:52.960 に答える