我正在为项目使用Play Framework v.1.2.6,尝试从数据库中检索对象时,我遇到了对象休眠的问题。
https://www.playframework.com/documentation/1.2.x/jpa

我有一个查询,该查询从mysql表中选择行,结果中存在代理对象。请参见下图。java - JPA持久性和Hibernate javassist对象-LMLPHP

我没有使用任何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();
}

09-10 10:05
查看更多