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注释.
看起来你可能正急切地想要在某个地方加入多对一的关系.默认行为是您为数据库返回的每一行获取一个实体.如果您不想更改热切的提取,但确实想要删除结果中的重复项,则需要使用以下命令ResultTransformer:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2835 次 |
| 最近记录: |