【问题标题】:Issue in HQL queries?HQL 查询中的问题?
【发布时间】:2014-07-11 03:36:18
【问题描述】:

这是一个测试程序。数据库中的表是学生,以 id 和 name 为列。 POJO 类是 Student,以 id 和 name 作为属性

servlet1 中使用的 HQL 查询是:

List<Student> l = ses.createQuery("select s.id, s.name from Student s").list();

        out.println("Database students are as follows:<br/>");
        Iterator it= l.iterator();
        while(it.hasNext())
        {
            Object o[]= (Object[]) it.next();
            out.println("Student id is :"+o[0]);
            out.println("<br/>");
            out.println("Student name is :"+o[1]);
            out.println("<br/>");
        } 

servlet2 中的 HQL 查询是:

List<Student> l=ses.createQuery("from Student").list();
        out.println("Database students are as follows:<br/>");
        Iterator it= l.iterator();
        while(it.hasNext())
        {
            Student s= (Student) it.next();
            out.println("Student id is :"+s.getId());
            out.println("<br/>");
            out.println("Student name is :"+s.getName());
            out.println("<br/>");
        }

在 servlet1 中,如果我使用 Student 对象而不是 Object 类对象,为什么不会从数据库中检索数据?反之,一切正常。

在 sevlet2 中,如果我使用 Object 类对象而不是 Student 对象,为什么不会从数据库中检索数据?反之,一切正常。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    小服务程序 1 和 2:

     List<Student> l = ses.createQuery("select s.id, s.name from Student s").list();
    

    该查询是对象的返回列表,因此您需要提及您要检索的对象类型。

    它返回学生 Object

     ses.createQuery("select s.id, s.name from Student s").list();
    

    如果您尝试使用

     List<Object> it also return your Student(base object of list) Object.but it not good.so,we specifically mentioned what exact format Object type.
    

    这两种情况,都需要进行铸造操作。

     List<Student> l =(List<Student>) ses.createQuery("select s.id, s.name from Student s").list();
     List<Object> l =(List<Object>) ses.createQuery("select s.id, s.name from Student s").list();
    

    【讨论】:

      【解决方案2】:

      您的第一个查询有多个子句,您无法转换为 List,因为 id 和 name 是不同的类型。所以它将是 List 类型。

      对于您的第二个查询,您将返回学生列表,因此您不应将其转换为 Object 类型,然后再次转换回 Student 类型。欲了解更多信息,请点击此处的链接-https://weblogs.java.net/blog/2007/04/25/java-persistence-query-return-types

      【讨论】:

        【解决方案3】:

        因为当您调用 l=ses.createQuery("from Student").list(); 时,您正在从数据库中检索完整的列集,并且可以正确实例化 Student 类。

        【讨论】:

        • 好的。 in l = ses.createQuery("select s.id, s.name from Student s").list();为什么使用 Object 类,为什么不使用 Student 类?
        • 我猜休眠假设当你使用列时,你可能没有使用所有可用的列。
        • 好的。为什么当hibernate无法确定所有列都被使用或少数列被使用时使用对象类?
        • 你建议它用什么?
        • 我建议应该使用列 id 和 name 因为这是在查询中指定的 ( l = ses.createQuery("select s.id, s.name from Student s").list ();)。但我的问题是为什么 Object 类而不是 servlet1 中的 Student 类?
        猜你喜欢
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 2011-07-22
        相关资源
        最近更新 更多