当前位置: 首页 > 知识库问答 >
问题:

Hibernate 4.3.5 DetachedCriteria未获取惰性列表

丌官星渊
2023-03-14

我有一个简单的查询很好地工作了一段时间,现在我将代码中的一些内容改为:
(hibernate.cfg.xml)

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>

和以下代码:

public UserEn findByIDFetch(Long id, String... fetches) {
    beginTransaction();

    DetachedCriteria dc = DetachedCriteria.forClass(UserEn.class);
    for (String fetch : fetches) {
        dc.createAlias(fetch, fetch, JoinType.INNER_JOIN);
    }

    dc.add(Restrictions.eq("id", id));

    UserEn result = (UserEn) dc.getExecutableCriteria(getSession()).uniqueResult();
    commitTransaction();
    return result;
}

提交后,result对象不会加载列表(即从Fetchs开始)
如果我执行result.GetAnyList().Size();在提交前,它会保持加载状态,而且,如果我使用HQL它工作得很好。(但这不是它应该如何工作(让它在使用时打开并加载),createAlias应该一如既往地正常工作)

看起来DetachedCriteria的createAlias没有获取给定路径(在本例中为CharacterenList)

@edit
我发现,如果我在所需路径中使用setfetchmode(在本例中为characterenlist)提取可以工作,但如果我使用createalias(像往常一样),它就会停止工作,我不知道是怎么回事,可能是hibernate bug或其他什么,不管怎样,我会等待有人回答,也许是有同样问题的人...

共有1个答案

鲁俊友
2023-03-14

发现同样的问题如下:https://hibernate.atlassian.net/browse/hhh-7842这可能是一个bug,如果我要求它在别名中是inner join,它应该是,我可以用HQL做到这一点,为什么我不能用标准做呢?

所以,现在我将不得不使用left_outer_join类型来解决这个问题,或者根本不使用别名(如果我不需要创建where子句或2深度提取)

希望能帮助到别人,谢谢你的帮助!

示例

dc.createAlias(fetch, fetch, JoinType.LEFT_OUTER_JOIN);

dc.setFetchMode(fetch, FetchMode.JOIN);
 类似资料:
  • 当然,这些列表有setter和getter。现在我想实现以用户身份不参加这些事件的可能性。因此,我尝试了以下方法: 我得到的例外情况如下: 尽管我使用了一些方法来确保执行惰性提取:

  • 问题内容: 我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。 当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常: :无法初始化代理-没有会话 这是由于Jackson尝试获取此未获取的对象。这里是对象: 和控制器: 有一种方法告诉杰克逊不要序列化未提取的对象?我一直在寻找3年前发布的

  • 我的理解是,默认情况下,Hibernate将所有关系类型的FetchType设置为lazy。 在我的例子中,我有一个双向的OneToMany-ManyToOne关系,如下所示: 另一个问题是我如何得到一个有特定名字的孩子?是否可以通过存储库进行操作?还是需要getChildren(parentId)并迭代直到找到以特定方式命名的那个? 编辑:在一些建议之后,我继续这样实现了我的ChildRepos

  • 很抱歉没有提供实际的代码,我的情况完全符合jackson中的问题--不要序列化惰性对象。由于这个问题没有解决方案,所以我强调了这个问题,以确保是否有解决方案,或者在本例中使用什么方法,而不是使用Jackson以JSON格式作为响应发送给对象。 谢谢

  • 问题内容: 我有一个返回用户对象的简单控制器,该用户的属性坐标具有hibernate属性FetchType.LAZY。 当我尝试获取该用户时,我总是必须加载所有坐标才能获取用户对象,否则,当杰克逊尝试序列化User时,将抛出异常: com.fasterxml.jackson.databind.JsonMappingException:无法初始化代理-没有会话 这是由于Jackson尝试获取此未获取

  • 如果我有一个实体和一些惰性集合(、、,...),并且希望编写一个JpaRepository-method,该方法为我提供所有的人,这些人都渴望获取,这可能吗? 我知道人们可以在单个物体上做到这一点,但这在某种程度上可以在人的集合上做到吗?