请我有这个错误
“org.hibernate.NonUniqueResultException:query没有返回唯一的 结果:2“
当我有一个结果并且我需要显示找到的两个(或更多)结果但是我不知道怎么做时它完美地工作!
这是我的代码:
public class ContactImplDataBase implements ContactDAO {
//.......
...
public Contact getContactByType(String type) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Contact.class)
.add(Restrictions.like("type", type));
tx.commit();
return (Contact)criteria.uniqueResult();}
}
和
public class ContactImpl implements ContactDAO {
//...
..
@Override
public Contact getContactByType(String type) {
Contact contact=null;
for(Contact c:contacts){
if(c.getType().equals(type)){
contact=c;
break;
}
}
return contact;
}
...}
在控制器中:
@RequestMapping(value="/rechercheContact")
public String rechercheContact(Model model, @RequestParam(value="type") String type){
List<Contact> liste=new ArrayList<Contact>();
liste.add(services.getContactByType(type));
model.addAttribute("listeContact", liste);
model.addAttribute("type", type);
return "ex";
}
任何帮助?!!
答案 0 :(得分:1)
你的功能在这里:
public Contact getContactByType(String type) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Contact.class)
.add(Restrictions.like("type", type));
tx.commit();
return (Contact)criteria.uniqueResult();} // TAKE NOTE OF THIS
}
您已将其设置为仅返回单个唯一结果。
这意味着如果没有单一的唯一结果,它将抛出异常。
这里有两个选项:
答案 1 :(得分:0)
错误消息似乎是一个休眠查询数据返回错误,可能是触发器:
return (Contact)criteria.uniqueResult();}
显示您的联系人表格使用“类型”字段查询来返回多条记录,因此有两种方法可以解决该问题:
criteria.uniqueResult()=&gt; if(Criteria.list()&gt; 0)返回criteria.list()。get(0)
修改数据库记录的数量,维护
选择count(*)contact where type ='xxx'
返回1条记录,超过其他数据删除。也可以用来索引数据库。
答案 2 :(得分:0)
我们在这里做一些代码审查:
格式化代码以提高可读性。
getContactByType
错误,因为一种类型可能有多个联系人,因此将您的方法重命名为getContactsByType
并让它返回List<Contact>
而不是单Contact
。
这也必须在未提供的界面ContactDAO
中进行更改。
课程ContactImpl
对我没有任何意义。
不要将事务用于数据库读取。
最后你应该让它发挥作用:
public class ContactImplDataBase implements ContactDAO {
@Override
public List<Contact> getContactsByType(String type) {
Session session = HibernateUtil.getSessionFactory().openSession();
Criteria criteria = session.createCriteria(Contact.class)
.add(Restrictions.like("type", type));
return (List<Contact>)criteria.list();
}
}
你的控制器:
@RequestMapping(value="/searchContacts")
public String searchContacts(Model model, @RequestParam(value="type") String type) {
List<Contact> list = services.getContactsByType(type);
model.addAttribute("contactList", list);
model.addAttribute("type", type);
return "ex";
}