0

我目前在播放框架 1.2.4 中遇到 JPA 问题。

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

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

如果我使用渴望而不是懒惰,则使用 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 会为 fetch 查询发送两个查询?

提前致谢

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 回答