Hibernate:行太多了

woy*_*aru 5 java persistence hibernate criteria

我在使用Hibernate从数据库中获取行时遇到问题.当我想只获得一行时,我收到的是20.当我想从表中获得大约1.5k行的所有行时,我收到了15.2k行.该表的实体类具有复合主键.

这是获取所有行的代码:

Criteria criteria = getSession().createCriteria(type);
criteria.setCacheable(true).setCacheRegion(BaseEntity.PACKAGE);
criteria.list();
Run Code Online (Sandbox Code Playgroud)

这是我的实体类:

@javax.persistence.Entity
@Table(name = "my_table")
public class My extends MyEntity<MyPK> {

    @EmbeddedId
    private MyPK id;

    @Column(name = "text", nullable = false)
    protected String text;

    @ManyToOne
    @JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
    protected Option option;

    @Override
    public MyPK getId() {
        return id;
    }

    @Override
    public void setId(MyPK id) {
        this.id = id;
    }

    //getters and setter
}
Run Code Online (Sandbox Code Playgroud)

这是MyPK课程:

@Embeddable
public class MyPK implements Serializable {

   @Column(name = "qwerty")
   protected String qwerty;

   @Column(name = "property")
   protected String property;

   //constructors, getters and setters
}
Run Code Online (Sandbox Code Playgroud)

MyEntityclass是带@MappedSuperclass注释的抽象类.这是这个类标题:

@MappedSuperclass
public abstract class MyEntity<T extends Serializable>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?这个问题出在了EmbeddedId吗?

编辑#1 我已经意识到这是问题所在:

@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;
Run Code Online (Sandbox Code Playgroud)

此对象包含另一个表的外键.另一张表引用了另一张表.最后一个表有10行用于上一个表.在结果中我得到行数量*10.问题可能在于我的实体中的Hibernate注释.

Kev*_*ker 7

看起来你可能正急切地想要在某个地方加入多对一的关系.默认行为是您为数据库返回的每一行获取一个实体.如果您不想更改热切的提取,但确实想要删除结果中的重复项,则需要使用以下命令ResultTransformer:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)