【问题标题】:Hibernate, getting duplicate values休眠,获取重复值
【发布时间】:2011-06-06 10:28:41
【问题描述】:

我正在编写一个非常简单的查询,但由于某种原因我得到了重复的值。

Criteria cr = session.createCriteria(ProcessInstance.class, "p")
        .add(Restrictions.isNull("end"));
@Cleanup ScrollableResults sr = cr.scroll(ScrollMode.FORWARD_ONLY);

while (sr.next()) {
    pi = (ProcessInstance) sr.get(0);
    String id = pi.getId(); //Getting duplicate values
}

pi.getId() 返回重复值。即:*9,9,10,10,11,11 etc*

但是,直接在mysql中运行这个查询

SELECT * FROM JBPM_PROCESSINSTANCE J where J.END_ IS NULL

不返回重复值。

谁能发现问题所在?

【问题讨论】:

  • 没有你的映射很难说。

标签: java hibernate criteria jbpm hibernate-criteria


【解决方案1】:

我遇到了和你一样的问题..

我就是这样解决的。

Criteria cr = session.createCriteria(ProcessInstance.class, "p")
        .add(Restrictions.isNull("end")).setProjection("id")

这将返回满足所有条件的所有 ID。

在你使用In限制并执行CriteriaSpecification.DISTINCT_ROOT_ENTITY之后。

您将能够在第二个标准中滚动您的结果。我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    快速的解决方法是使用 Distinct Root Entity Result Transformer。

    ...
    crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    List unique = crit.List();
    ...
    

    但这只是一种解决方法。

    我怀疑问题出在您的映射上。如果从 ProcessInstance 到其他东西(称为 X)存在任何急切加载的 1:n 关系,并且一个 ProcessInstance 有多个 (n) X,那么您将在结果列表中获得多个 ProcessInstance 项 (n)进程实例。 -- 如果这真的是原因,那么 workarround 不仅仅是一个 workarround,那么它就是解决方案。

    【讨论】:

    • 是的,这是正确的。我们将映射更改为 fetch Eager。谢谢
    • 这没有帮助。我们仍然得到重复。 resultTransformer 是否仅适用于 List()?我们正在使用滚动。
    • 你理解错了:如果关系是 fetched egger,则可能会出现问题 - 将其更改为惰性。
    • 我不能把它改成懒惰的。由于 jbpm/seam 中的另一个错误,我们一定很渴望。还有其他解决方法吗?我还可以报告您的解决方案使用list() 有效。但是,我正在寻找使用 scroll 的解决方案
    • 在这种情况下,结果变压器是我知道的唯一解决方案吗 - 但它需要先加载所有实体,这就是滚动不起作用的原因。
    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2012-05-24
    • 2018-10-19
    • 2018-04-10
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多