复杂的 Activiti + JPA 查询
Posted
技术标签:
【中文标题】复杂的 Activiti + JPA 查询【英文标题】:Complex Activiti + JPA queries 【发布时间】:2012-11-13 15:38:23 【问题描述】:我们正在尝试在一个新项目中使用 Activiti。我创建了一个设置,它通过 JPA 使用 Hibernate 来持久化进程中涉及的实体,并且 JPA 与 Activiti 互连,因此我们可以将这些实体用作 JPA 变量。见:JPA chapter of Activiti's documentation
我发现 Activiti 不允许我在涉及 JPA 变量的进程上创建查询,我喜欢在 JPA 实体字段上进行过滤。例如,如果我有一个带有引用 Book 实体的变量的流程,我无法为具有特定标题的图书的流程创建查询。
克服这个问题的最佳方法是什么?我虽然关于使用 Hibernate 单独查询实体,然后在 Activiti 上进行第二次查询以获取所涉及的进程,但我担心它会很慢。另外,如果我以相反的方式进行操作(首先查询进程,然后在实体上使用 Hibernate 进行第二次查询),Activiti 对 JPA 变量进行了不必要的填充,我不知道如何仅获取实体 ID保存到我数据库的 Activiti 变量表中。
【问题讨论】:
我试图通过将 Activiti processInstanceId 嵌入到我用作 JPA 变量的实体中来解决这个问题。这样,我必须只获取有趣的进程,并且我可以在不从 JPA 获取的情况下获取进程 ID。然后我对 JPA 进行第二次查询,其中文档 ID 在我上面描述的集合中。我会看看它是如何工作的。 【参考方案1】:如何使用您的实体 ID 作为流程的 businessKey? 然后您可以对您的实体(具有特定标题的书籍)进行查询,然后使用它来检索您在 Activiti 中的流程
【讨论】:
我目前正在试验相反的情况。我已经把实体所涉及的processInstanceId放到了实体本身中。 我喜欢相反的方式,因为它不需要更改您的实体并让您的域独立于 Activiti。以防您决定使用另一个工作流引擎 这不起作用,因为您无法使用业务键列表查询流程实例。您只能查询特定键。我认为遍历 JPA 结果列表并为每个结果查询 Activiti 的效率非常低。【参考方案2】:我已经实施了问题 cmets 中描述的解决方案。我还没有大数据集来测试性能,但它似乎可以接受。
【讨论】:
以上是关于复杂的 Activiti + JPA 查询的主要内容,如果未能解决你的问题,请参考以下文章
Spring Hibernate JPA 联表查询 复杂查询