Hibernate criteria.createAlias()将数据相乘

Hibernate criteria.createAlias()将数据相乘,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我正在使用以下代码检索我的数据 Criteria cr = session.createCriteria( JobProcess.class ); cr.createAlias("sendMarcs", "sm"); cr.addOrder( Order.desc( "processedTime") ); cr.addOrder( Order.asc( "sm.ats" ) ); 它返回所有数据,但所有数据都会多次出现,返回一个大小为673的列表,而它应该是一个大小为99的列表。我不知道为什么

我正在使用以下代码检索我的数据

Criteria cr = session.createCriteria( JobProcess.class );
cr.createAlias("sendMarcs", "sm");
cr.addOrder( Order.desc( "processedTime") );
cr.addOrder( Order.asc( "sm.ats" ) );
它返回所有数据,但所有数据都会多次出现,返回一个大小为
673
的列表,而它应该是一个大小为
99
的列表。我不知道为什么会这样

是的,我看过hibernate使用的SQL,它是正确的

此外,如果删除别名及其顺序,则数据将按预期显示。不相乘,但不排序

JobProcess.java

@Entity
@Table(name = "jobprocess")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class JobProcess {

    @Id
    @GeneratedValue
    private Long id;

    @Basic(optional = false)
    @Column(length = 20, name="customerid")
    private String customerId;

    @Basic(optional=false)
    @Column(length = 100)
    private String ATS;

    @Basic(optional=true)
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="timeprocessed")
    private java.util.Date processedTime;

    @Basic(optional=false)
    @Column(length = 1)
    private String state;

    @Column(length = 300)
    private String notes;

    @Basic(optional = false)
    private long nos;

    @OneToMany(mappedBy = "jobprocessid")
    private Set<SendMarc> sendMarcs = new HashSet<SendMarc>();

    // getters and setters
}

它为每个检索到的行返回一个对象,就像没有distinct的HQL查询一样。对于条件,必须使用

cr.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
#createAlias()
为它也加入的关联创建别名。在您的情况下,如果没有它,您只需从
JobProcess
表中检索所有没有联接的行,如果有其他联接,您将得到不同的结果

cr.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);