SetMaxResults()在Hibernate中不起作用

时间:2016-03-21 09:04:08

标签: java hibernate

我是Hibernate的新手并使用SetMaxResults()函数获取一些错误。这是我的MySQL表数据::

1   J. C. Smell
2   J. C. Smell
3   J. C. Smell
4   J. C. Smell

这是从4个相同记录中检索一条记录的方法。

private Person findPerson(Session session, String name){
        Query query = session.createQuery("from Person p where p.name=:name");
        query.setParameter("name", name);
        query.setMaxResults(1);
        Person person = (Person)query.list();
        if(person == null)
            return null;
        return person;
    }

我希望得到一条记录但是根据Exception我得到一个记录的ArrayList。例外来自这条线  Person person = (Person)query.list();该行在源代码中的编号为34。这是个例外。

java.lang.ClassCastException: java.util.ArrayList cannot be cast to chapter3.simple.Person
    at chapter3.simple.RankingTest.findPerson(RankingTest.java:34)
    at chapter3.simple.RankingTest.savePerson(RankingTest.java:41)
    at chapter3.simple.RankingTest.testSaveRanking(RankingTest.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    ...
    ...

我做错了什么?感谢

修改

嗨,setMaxResults(1)是不是要从记录中返回1个结果?

3 个答案:

答案 0 :(得分:3)

 Person person = (Person)query.list();

这是非法演员。虽然列表中只有一个元素,但您无法将列表神奇地转换为Person。设置最大结果时,它仍会返回包含1个元素的列表。

因此你必须做

Person person = (Person)query.list().get(0);

答案 1 :(得分:1)

更好地使用

Person person = (Person)query.uniqueResult();

但是要小心,如果没有唯一的条目,它会引发异常。

但是你的情况使用

Person person = (Person)query.list().get(0);

答案 2 :(得分:1)

只需像这样更改你的代码,我希望它能运作。感谢

private Person findPerson(Session session, String name){
        Query query = session.createQuery("from Person p where p.name=:name")
        query.setParameter("name", name)
        query.setMaxResults(1);
        return (Person)query.uniqueResult();
}