0

私はGroovyとHQLのクエリを初めて使用しますが、これに対する解決策がどこにも見つからないため、気が狂っています。

1対多の関係が定義された2つのドメインクラスがあり(ユーザーは多くの会社を持つことができます)、「テーブル結合」を効果的に行う必要があります(伝統的に呼ばれるもの)が、明らかにオブジェクトを使用しています。

クラスは次のようになります。

class User {
    transient springSecurityService

    static hasMany = [company: Company]

    String username
    String password
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired
    ...
    ...
    ...
}

...そして会社のクラス

class Company {
    static scaffolding = true

    String name
    String address1
    String address2
    String address3
    String address4
    String postCode
    String telephone
    String mobile // mobile number to receive appointment text messages to
    String email // email address to receive appointment emails to  

    static hasMany = [staff: Staff]
    static belongsTo = [user: User]

    ...
    ...
    ...
}

Gorm はuser_idcompany テーブル内にフィールドを作成しましたが、これをクエリで使用しようとするとエラーが返されます。

では、次のようなことをするにはどうすればよいでしょうか。

select * from user u, company c, where u.id = c.user_id;

これを行う最善の方法は何ですか?

4

1 に答える 1

4

join次のような関連付けで効果的に使用できます。

HQL
select * from User as u inner join fetch u.company as companies where u.id = ?

fetchクエリで を使用すると、関連する のコレクションが積極的にフェッチされることに注意してくださいcompaniesuser

findAll()

User.findAll("from User as u inner join fetch u.company as companies where u.id = ?", [1])

HQL の代わりに使用する利点はfindAll、次のようなページネーションを簡単に実装できることです。

User.findAll("from User as u inner join fetch u.company as companies where u.accountExpired = true", [max: 10, offset: 5])

具体的な実装を取得し、物事を詳細に理解するには、findAllおよびHQL 関連付けを確認することを強くお勧めします。

于 2013-06-23T22:47:41.057 に答える