SetMaxResults()在Hibernate中不按预期工作

drkbr07n  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(73)

我是Hibernate的初学者,在使用SetMaxResults()函数时出现了一些错误。这是我的MySQL表数据:
这是从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;
    }

我希望得到一个记录,但根据异常我得到一个记录的数组列表。异常来自这行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个结果?

wlp8pajw

wlp8pajw1#

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

这是非法的演员阵容。虽然列表只有一个元素,但不能神奇地将列表转换为Person。当你设置max result时,它仍然返回一个包含1个元素的列表。
所以你必须

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

p8ekf7hl2#

更好地利用

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

但是要小心,如果没有唯一的条目,它会抛出异常。
但这是你的案子

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

6rqinv9w3#

就像这样修改你的代码,我希望它能工作。谢谢

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();
}

相关问题