【问题标题】:How to set an empty collection in JPQL如何在 JPQL 中设置一个空集合
【发布时间】:2014-05-08 00:07:47
【问题描述】:

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

使用 JBoss,我使用 RestEasy 发出 RESTful Web 服务请求。 Jackson 技术将我的主题转换为 JSON。

我查找主题的请求是:

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

问题是每个评论现在都有一个PersistentBag 而不是一个列表,并且 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 查询中强制这个空值?

【问题讨论】:

  • 另一种方法是限制Json序列化的深度,但是因为Json比较复杂,我可能需要在另一个分支更深入
  • 使用 Jackson 视图或 mixin,甚至将您的主题转换为包含您想要序列化的数据的 DTO,而不是更多。
  • 我不想要技术答案,因为我也可以使用 mustache 模板引擎。而且我不想围绕每个域对象创建 3-4 个 DTO,因为有一天我不需要标志,然后不需要帐户等。
  • 尝试在 Comment 实体中将标志初始化为 ArrayList? private List flags = new ArrayList();

标签: hibernate jboss jpql


【解决方案1】:

您不能告诉 Hibernate 简单地忽略集合的存在:它将使用自己的集合实现(PersistentBag 或 PersistentList)进行代理,并填充数据。
我认为这取决于您的序列化程序。

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

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 2021-09-10
    • 2020-06-11
    • 1970-01-01
    • 2011-11-09
    • 2016-10-07
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多