我正在使用hibernate将MySQL数据库中的结果检索到我的Java项目中。最近,我有很多冗余数据,不得不通过将所需数据复制到新表中然后将新创建的表重命名为旧表来手动清理数据库。
但是,现在使用hibernate查询数据库只会给出一行结果。我手动检查了数据库,数据库中有几个不同的行。我对Hibernate的查询是这样的:
Criteria c = session.createCriteria(UserDto.class);
c.setMaxResults(100);
List<UserDto> users = c.list();
users
包含100个元素,但都是相同的。
userDto的映射是here。
知道这里发生了什么吗?
答案 0 :(得分:1)
如果您的UserDto类具有ToMany关系,则很可能外部连接会导致许多记录都包含一个相同的用户数据。你应该使用
session.createCriteria(UserDto.class).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
答案 1 :(得分:0)
仔细检查UserDto类到数据库的映射。 我的猜测是你没有把它映射到你认为你做的表。 正如Sebastien所提到的,将hibernate.show.sql设置为true应该会使这一点显而易见。
答案 2 :(得分:0)
你删除了旧表吗?在配置文件中,“hibernate.hbm2ddl.auto”的值是多少?
答案 3 :(得分:0)
我认为原因是这些记录具有相同的id,因此Hibernate将它们视为同一记录。你可以查一下。
答案 4 :(得分:0)
我有同样的问题。就我而言,当我在MySQL中手动创建表并尝试使用hibernate和dto类从该表中读取数据时,便检测到该问题。在检查了dto类字段和数据库表之后,我发现名为“ id”的表列与名为dbId的类字段之间存在差异。代码是这样的:
@Id
@GeneratedValue
@Column(name="db_id", unique = true)
private long dbId;
因此,我编辑了名称并更改了代码:
@Id
@GeneratedValue
@Column(name="id", unique = true)
private long dbId;
哪个“ id”是数据库表列的正确名称,问题已解决。