我正在为项目使用Play Framework v.1.2.6,尝试从数据库中检索对象时,我遇到了对象休眠的问题。
https://www.playframework.com/documentation/1.2.x/jpa
我有一个查询,该查询从mysql表中选择行,结果中存在代理对象。请参见下图。
我没有使用任何Hibernate配置文件。我在模型类中仅使用@Annotations。
我的查询示例:
static List<User> getAllUsersFromAccount(Account account) {
return User.find(
"SELECT u " +
"FROM User u " +
"WHERE u.account=?",
account).fetch();
}
有谁知道如何避免在查询结果中获取代理对象?
现在,我们遍历用户数组,并检查该实体是否为HibernateProxy的instance。我们不想这样做,因为也许我们有相同的问题以及其他查询。
private static <T> T initializeAndUnproxy(T entity) {
Hibernate.initialize(entity);
if(entity instanceof HibernateProxy) {
entity = (T)((HibernateProxy)entity).getHibernateLazyInitializer().getImplementation();
}
return entity;
}
最佳答案
您可以在JPQL / HQL查询中使用JOIN FETCH关键字。在您的示例中,如果您不想处理代理对象而不是真实的Account对象,请添加“ JOIN FETCH u.account”
static List<User> getAllUsersFromAccount(Account account) {
return User.find(
"SELECT u " +
"FROM User u " +
"JOIN FETCH u.account " +
"WHERE u.account=?",
account).fetch();
}