查询如何在spring中返回多个值

时间:2015-08-27 03:16:01

标签: spring hibernate

请我有这个错误

  

“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";
     }

任何帮助?!!

3 个答案:

答案 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. 确保您搜索的数据是通过唯一标识符
  2. 更改getContactByType函数以返回List而不是Contact并将(contact)criteria.unique()更改为criteria.list();

答案 1 :(得分:0)

错误消息似乎是一个休眠查询数据返回错误,可能是触发器:

return (Contact)criteria.uniqueResult();}

显示您的联系人表格使用“类型”字段查询来返回多条记录,因此有两种方法可以解决该问题:

  1. criteria.uniqueResult()=&gt; if(Criteria.list()&gt; 0)返回criteria.list()。get(0)

  2. 修改数据库记录的数量,维护

  3.   

    选择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";
}