Java 休眠:获取太多行

Java 休眠:获取太多行,java,hibernate,persistence,criteria,Java,Hibernate,Persistence,Criteria,我无法使用Hibernate从数据库中获取行。当我只想得到一排,我收到20。当我想从表中获得大约1.5k行的所有行时,我正好收到15.2k行。 此表的实体类具有复合主键 这是我获取所有行的代码: Criteria criteria = getSession().createCriteria(type); criteria.setCacheable(true).setCacheRegion(BaseEntity.PACKAGE); criteria.list(); 这是我的实体类: @javax

我无法使用Hibernate从数据库中获取行。当我只想得到一排,我收到20。当我想从表中获得大约1.5k行的所有行时,我正好收到15.2k行。 此表的实体类具有复合主键

这是我获取所有行的代码:

Criteria criteria = getSession().createCriteria(type);
criteria.setCacheable(true).setCacheRegion(BaseEntity.PACKAGE);
criteria.list();
这是我的实体类:

@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
}
MyEntity
类是带有
@MappedSuperclass
注释的抽象类。这是该类标题:

@MappedSuperclass
public abstract class MyEntity<T extends Serializable>

此对象包含另一个表的外键。这另一个表引用了另一个表。最后一个表有前一个表的10行。在结果中,我得到了行数*10。问题可能是my entities中的Hibernate注释。

您可以通过使用此方法在标准上设置最大结果数:

@Embeddeble仅意味着MyPK的列将是my类中的列。
您的问题可能是
@ManyToOne@JoinColumn(name=“property”)
,因为它与MyPK中的“property”相同,主键类需要根据聚合值定义equals()和hashCode()(
qwerty
property
,此处)。在处理结果集时,Hibernate很可能没有看到跨多行的实体键相等

来自JPA2.0规范第2.4节(如果有帮助):

主键类必须定义equals和hashCode方法。价值的语义学 这些方法的相等性必须与数据库类型的数据库相等性一致 密钥映射到的对象


看起来你可能在某处急切地加入了多对一的关系。默认行为是为数据库返回的每一行获取一个实体。如果不想更改即时抓取,但想删除结果中的重复项,则需要使用此
ResultTransformer

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

是的,MyPK中的“属性”也是一样的。我是这样写的,因为这是主键的一部分,也是表中的外键。我定义了
equals()
hashCode()
,但我的问题仍然是一样的。你还有其他建议吗?我想知道我的实体是否正确,所以我也问了这个问题:你能读懂这一个吗?是的,我能,但我需要更复杂的解决方案。当有一个简单的解决方案时,你为什么想要一个复杂的解决方案?!因为我不知道要返回多少行。此计数存储在数据库中,可能会有所不同。返回的对象是否都是同一实例?意思是说你得到了20个完全相同的对象引用吗?@SteveEbersole:我想是的。我明天会查的,因为现在不行。我从Hibernate控制台签出了sql,我意识到Hibernate从数据库中获得了另外几个选项卡。当然,这些表是通过外键连接的。但我不知道为什么对于从一个表中获取所有行的简单操作,我的代码得到的附加表很少。对于数据库中的一行,我得到十行作为查询结果。@SteveEbersole:我已经检查过了。我得到一个对象的10个实例,另一个对象的10个实例。
@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);