我目前在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会为获取查询发送两个查询?
提前致谢
答案 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);
愿力量与你同在!