0

現在、PlayFramework1.2.4でJPAに問題があります。

別のデータベースにUserOptionsモデルが必要であり、それを怠惰に結合したいので、1つのクエリでのみ必要になります。

このクエリでは、オプションを熱心にロードしたいと思います。検索すると、結合クエリを使用することによってのみ実行できることがわかりました。

怠惰な代わりに熱心に使用する場合、User.findById()とオプションを使用することですべてがうまくいき、ユーザーは1つのクエリで見つかります。

しかし、「左結合フェッチ」クエリを使用すると、playは2つのクエリを送信します。だからここにクエリがあります:

User.find("
    SELECT
        user
    FROM
        User user
    LEFT JOIN FETCH
        user.options options
    WHERE
        user.id = ?
", Long.parseLong(id)).first();

そしてここにモデル:

@Entity
public class User extends Model
{

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
    public UserOptions  options;

    // ...

}

@Entity
public class UserOptions extends Model
{

    @OneToOne(fetch = FetchType.LAZY)
    public User user;

}

問題は、playがフェッチクエリに対して2つのクエリを送信する理由です。

前もって感謝します

4

1 に答える 1

0

わかりました、自分で手に入れました。クエリはまだ同じです。

問題は、カスタム クエリがデフォルトでキャッシュされないことでした。そこで、このコードを使用してデータベース キャッシュを提供しました (現在の要求のみ)。

        // Get database cache instance
        EhCacheImpl cache = EhCacheImpl.getInstance();

        // Get cached user
        User user = (User)cache.get("UserWithOptions_"+id);

        // Check whether a user is cached
        if(user == null)
        {
            // Get the user
            user = User.find("SELECT user FROM User user LEFT JOIN FETCH user.options options WHERE user.id = ?", Long.parseLong(id)).first();
        }

        // Refresh cache
        cache.add("UserWithOptions_"+id, user, 0);

力があなたと共にありますように!

于 2012-10-24T18:32:52.900 に答える