【问题标题】:SetMaxResults() Not Working In HibernateSetMaxResults() 在休眠中不起作用
【发布时间】:2016-03-21 09:04:07
【问题描述】:

我是 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;
    }

我希望得到一条记录,但根据异常,我得到了一个 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 个结果吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:
     Person person = (Person)query.list();
    

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

    所以你必须这样做

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

    【讨论】:

    • 嗨,setMaxResults(1) 不应该从记录中返回 1 个结果吗?
    • 很容易出错,当然Person person = (Person)query.list().get(0);
    • @EddyFreeman 是的。它只返回一个元素,它在列表中。不是直接的人:)
    • @v.ladynev 如果答案有任何改进,请随时编辑帖子。
    • @sᴜʀᴇsʜᴀᴛᴛᴀ 查询可以返回一个空列表:)
    【解决方案2】:

    更好用

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

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

    但你的情况使用

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

    【讨论】:

    • 不适合,因为异常,当没有结果记录时。
    • 很容易出错,当然Person person = (Person)query.list().get(0);
    • @v.ladynev 以未知顺序获取非唯一条目不是一个好习惯,所以我认为主题启动器应该使用更严格的标准来获得唯一结果
    • @v.ladynev 有时最好捕获花费大量时间在数据库中查找重复项的异常
    【解决方案3】:

    只需像这样更改您的代码,我希望它会起作用。谢谢

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      相关资源
      最近更新 更多