2012-10-24 37 views
0

我目前在播放框架1.2.4 JPA有問題。Playframework發送2查詢獲取查詢

我需要在一個單獨的數據庫中有一個UserOptions模型,並且想要在一個查詢中只需要它就會加入它。

在這個查詢中,我想加載選項並通過搜索我發現只能通過使用連接查詢來完成。

如果我使用eager而不是oder懶惰,通過使用User.findById()並且選項和用戶在一個查詢中找到,一切都會好起來的。

但是,當我使用「左連接提取」查詢時,play會發送兩個查詢。因此,繼承人查詢:

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; 

} 

的問題是,爲什麼打發送兩個查詢抓取查詢?

在此先感謝

+0

另一個問題:當我使用findById時,緩存請求。當我用查詢使用find時,play不會。也許這是同一個問題。如何製作播放緩存用戶? – michiruf

回答

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

願力量與你同在!