【问题标题】:Hibernate query for selecting multiple values用于选择多个值的休眠查询
【发布时间】:2012-11-16 10:30:27
【问题描述】:

在休眠状态下,我可以进行以下操作

Query q = session.createQuery("from Employee as e);
List<Employee> emps = q.list();

现在如果我想获取 int 和 String 我该怎么做?

Query q = session.createQuery(""SELECT E.firstName,E.ID FROM Employee E";
List ans = q.list();

现在列表的结构是什么?

【问题讨论】:

  • 查看Adisesha's answer。它比 IMO 的答案更优雅,只是您需要在 HQL 中使用别名。

标签: java hibernate hql


【解决方案1】:

您应该使用一个新对象来保存这些值,就像这样:

"SELECT NEW EmpMenu(e.name, e.department.name) "
                + "FROM Project p JOIN p.students e " + "WHERE p.name = :project "
                + "ORDER BY e.name").setParameter("project", projectName).getResultList()

这个例子来自http://www.java2s.com/Tutorial/Java/0355__JPA/EJBQLCreatenewObjectInSelectStatement.htm

【讨论】:

    【解决方案2】:
    List<Object[]> is the structure.
    

    所以你得到每个元素是这样的:

    List ans = q.list();
    for(Object[] array : ans) {
        String firstName = (String) array[0];
        Integer id = (Integer) array[1];
    }
    

    【讨论】:

      【解决方案3】:

      您将获得Objects 的数组列表(每个数组有两个元素)

      List< Object[] > employees = q.list();
      
      for ( Object[] employee : employees ) {
          // employee[0] will contain the first name
          // employee[1] will contail the ID
      }
      

      【讨论】:

      • 数组的顺序是不是由查询的顺序决定的?
      【解决方案4】:

      这很好。您唯一需要了解的是,它将返回Object [] 的列表,如下所示:

           Query q = session.createQuery("select e.id, e.firstName from Employee e");
           List<Object[]> employees= (List<Object[]>)q.list();
           for(Object[] employee: employees){
               Integer id = (Integer)employee[0];
               String firstName = (String)employee[1];
               .....
           }
      

      【讨论】:

      • 如果我有一个多对多关系并且中间表没有建模为类怎么办。如何在 hql 查询中使用该表?
      • @user93796 Hibernate 还允许您运行标准的SQL,您可以将其创建为:Query q = session.createSQLQuery("select id, first_Name from Employee"); 其中createSQLQuery 用于运行SQL; id & first_Name 是数据库列,Employee 是数据库表。
      • @user93796 不确定我之前的消息是否清楚。我的意思是:如果你想在查询中使用未映射的表,那么SQL 是更好的选择。
      • 感谢您的帮助。让我说清楚。我在表 A 和表 B 之间有一个多对多的关系。表 C 将 A 映射到 B 的 BA 集合。而 B 有 A 的集合。现在我想选择所有具有 B b1 作为其实体之一的 A set.Eg 考虑 stackoverflow。我想选择所有将 java 作为其标签之一的帖子。在这种情况下,A 表是 Post,B 是标签,C 是 A 和 B 之间的关系。我将如何使用 HQL 获取 n 个 Java 标签的帖子
      • @user93796:这与您之前发布的问题完全不同。无论如何,尝试类似:select p from Post p join p.tags t where t.tagName in ('Java')。如果您已正确完成映射,这应该可以完成您的工作。
      【解决方案5】:
      Query qry=session.createQuery("select e.employeeId,e.employeeName from Employee e where e.deptNumber=:p1");
      qry.setParameter("p1",30);
      List l2=qry.list();
      Iterator itr=l2.iterator();
      while(itr.hasNext()){
      Object a[]=(Object[])itr.next();
      System.out.println(a[0]+"/t"a[1]);
      }
      

      【讨论】:

        【解决方案6】:

        没有迭代器:

        @SuppressWarnings( "unchecked" ) 
        public List<Employee> findByDepartment(long departmentId){ 
        
            SQLQuery query = session.createSQLQuery("SELECT {emp.*} " +
                                                     " FROM employee emp " + 
                                                    +"WHERE emp.department_id = :departement_id");
            query.setLong("department_id",  departmentId);
            query.addEntity("emp",  Employee.class);                        
            return (List<Employee>) = query.list();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-13
          相关资源
          最近更新 更多