Java Hibernate迭代器检索相同的数据
我有一个通过hibernate连接到数据库的表单。使用此表单,用户可以进入并填写姓名、地址和电子邮件信息等字段。填写完信息后,他们将提交表单。提交后,所有信息将显示在同一页面的数据表上 我正在使用会话与数据库交互。然而,从数据库填充的数据似乎不正确Java Hibernate迭代器检索相同的数据,java,hibernate,loops,iterator,Java,Hibernate,Loops,Iterator,我有一个通过hibernate连接到数据库的表单。使用此表单,用户可以进入并填写姓名、地址和电子邮件信息等字段。填写完信息后,他们将提交表单。提交后,所有信息将显示在同一页面的数据表上 我正在使用会话与数据库交互。然而,从数据库填充的数据似乎不正确 public void somefunction() { //The sessionfactory is being configured in another class Session s = sessionFactory.op
public void somefunction() {
//The sessionfactory is being configured in another class
Session s = sessionFactory.openSession();
Transaction tx= null;
try {
tx= s.beginTransaction();
List userInformation = s.createQuery("FROM database1 WHERE PKEY ='"+somevalue+"'").list();
for(Iterator iterator = userInformation.iterator; iterator.hasNext();){
//database1 is an entity bean
database1 x = (database1) iterator.next();
System.out.print(x.getName());
}
tx.commit();
}
catch(Exception) {......}
finally {.....}
}
在用户提交第一个“用户”及其信息后,所有内容都显示在数据表中。但是,当他们输入第二个“用户”时,数据表上显示的行与第一个用户的信息相同,即使数据不同。我认为代码看起来是正确的,所以我不确定这有什么问题。您应该使用主键来获得正确的值。 List userInformation=s.createQuery(“从数据库1中,您的ID='PK')).List() 在您的查询中,它将始终返回第一行。找到了解决方案 我没有使用session.createQuery(“QUERY”),而是使用
Criteria cr = session.createCriteria(SomeClass.class)
cr.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
cr.add(/* add some filters here */);
ScrollableResults sr = cr.scroll(ScrollMode.FORWARD_ONLY);
while(sr.next) {
someObject so = (someObject) sr.get(0);
//Do action here
}
这解决了我重复一个结果的问题 迭代前检查列表大小?上面的代码看起来不错。你能分享你的原始代码片段吗?我怀疑这是某个对象引用问题。@user1817081我在您的查询中没有看到任何主键。更改对象的名称(掩码)以保持机密性,但发布确切的代码片段(不要共享完整代码)。我怀疑您可能在某处使用了相同的对象引用。@user1817081我认为objectA是一个实体引用,为什么由objectA强制转换?@Mohammod代码已更新。谢谢,对不起,忘记添加该部分了。我确实让它过滤到一个主键中的特定值。然后它是由join引起的。我相信您可以简单地在HQL中使用
distinct
。即使不是这样,创建一个HashSet并将所有结果放在该集中也应该做到这一点(这或多或少是不同的\u ROOT\u实体在做这一点)