Playframework为获取的查询发送2个查询

时间:2012-10-24 16:30:06

标签: caching jpa playframework

我目前在Play框架1.2.4中遇到了JPA问题。

我需要在一个单独的数据库中拥有一个UserOptions模型,并希望懒惰地加入它,因为它只需要在一个查询中。

在这个查询中,我想热切地加载选项,通过搜索我发现只能通过使用连接查询来完成。

如果我使用eager而不是懒惰,一切都可以使用User.findById()并且选项和用户在一个查询中找到。

但是当我使用'left join fetch'查询时,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;

}

问题是为什么Play会为获取查询发送两个查询?

提前致谢

1 个答案:

答案 0 :(得分: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);

愿力量与你同在!