使用FetchMode的Hibernate子标准不起作用

时间:2014-06-18 05:50:47

标签: hibernate hibernate-criteria

我想使用具有一对多字段的某些条件的标准

简要介绍我的模型,一个item有多个options
因为我希望item使用已过滤的options,并将其传递给JSON Parser(没有会话),所以当我(查询它)时我必须得到选项。 / p>

在为选项添加限制之前,我已编码如下,它对我很有用。

Item item = (Item)session.createCriteria(Item.class)                                        
                .setFetchMode("options", FetchMode.JOIN)
                .add(Restrictions.eq("id", id))
                .uniqueResult();

但是当我向options添加限制时,它会发生错误(确切地说,当被调用函数尝试访问项目时,搜索工作正常。)

Item item = (Item)session.createCriteria(Item.class)
                .setFetchMode("options", FetchMode.JOIN)
                .add(Restrictions.eq("id", id))
                .createCriteria("options").add(Restrictions.eq("status", ItemStatus.ABLE))
                .uniqueResult();

错误是:

failed to lazily initialize a collection of role: options, could not initialize proxy - no Session

我已将setFetchMode添加到子标准的末尾,结果相同。

发生什么事了!?你能告诉解决方案吗?

1 个答案:

答案 0 :(得分:0)

我认为在options关闭后尝试访问session时出现错误。根据hibernate集合默认是延迟加载的。如果您想要optionsitem一起提取,那么无论您使用什么,都必须在注释或映射文件中设置FetchType EAGER (FetchType.EAGER)

您可以尝试使用此代码吗

Item item = (Item)session.createCriteria(Item.class)
            .setFetchMode("options", FetchMode.SELECT)
            .add(Restrictions.eq("id", id))
            .createCriteria("options").add(Restrictions.eq("options.status", ItemStatus.ABLE))
            .uniqueResult();