我想使用具有一对多字段的某些条件的标准
简要介绍我的模型,一个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添加到子标准的末尾,结果相同。
发生什么事了!?你能告诉解决方案吗?
答案 0 :(得分:0)
我认为在options
关闭后尝试访问session
时出现错误。根据hibernate集合默认是延迟加载的。如果您想要options
和item
一起提取,那么无论您使用什么,都必须在注释或映射文件中设置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();