如何在JPQL中设置一个空集合

时间:2013-11-12 22:16:13

标签: hibernate jboss jpql

问题有点尴尬。我有一个主题(在一个论坛上的一些会谈)与评论,每个评论可以有多个审核标志。

使用JBoss,我使用RestEasy创建一个RESTful Web服务请求。杰克逊技术将我的主题转变为JSON。

我找到主题的请求是:

Select s from Subject s JOIN FETCH s.comments WHERE s.id = :id

问题是每个Comment现在都有一个PersistentBag而不是List,并且JBoss会抛出:

org.codehaus.jackson.map.JsonMappingException: 
failed to lazily initialize a collection of role: io.robusta.fora.domain.Comment.flags, no session or session was closed (through reference chain: 

java.util.ArrayList[0]
->io.robusta.fora.domain.Subject["comments"]
->org.hibernate.collection.internal.PersistentBag[0]
->io.robusta.fora.domain.Comment["flags"])

实际上我只想在此特定请求中忽略这些标记。所以我做的很糟糕但是有效:

for (Comment c : comments ){c.setFlags(new ArrayList<Flag>());}

但为了避免这个糟糕的循环,有没有办法在JPQL查询中强制这个空值?

1 个答案:

答案 0 :(得分:1)

你不能告诉Hibernate简单地忽略集合的存在:它将使用自己的集合实现(PersistentBag或PersistentList)代理并填充数据。
我认为由您的Serializer决定是否考虑它。

您可以在Jackson中编写一个自定义序列化程序,分配给flags集合,该集合将使用方法Hibernate.isInitialized()检查集合是否已初始化以决定是否将序列化。 (但这是技术答案......)