HQL语句--select(选择)

原文地址:https://blog.csdn.net/syf1970/article/details/52396945

以Object[]类型返回选择的属性:
如果在select子句中只是指定了选择的对象和属性,没有指定返回的数据类型,默认查询结果以对象数组Object[]形式返回。
eg:

@Test
    public void testSelectClauseObjectArray(){ //通过select子句指定返回Object[]类型查询结果
        //注:不能只指定一个属性,因为返回类型就不是对象数组,而是对象,要将Object[]改为Object
        String hql="select s.name,s.tel,s.address,s.star from Seller s"; //通过别名来引用持久化类的属性。

        Query query =session.createQuery(hql);

        List<Object[]> list=query.list(); //返回结果是对象数组

        for (Object[] objects : list) {
            System.out.println("name:"+objects[0]); //在对象数组中的位置与选择属性顺序一致
            System.out.println("tel:"+objects[1]);
            System.out.println("address:"+objects[2]);
            System.out.println("star:"+objects[3]);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

控制台:
这里写图片描述

:当只查询持久化类的一个属性时,返回的结果就是对象Object,而不是对象数组Object[],那么更改如下:

@Test
    public void testSelectClauseObjectArray(){ //通过select子句指定返回Object[]类型查询结果
        //注:只指定一个属性时,返回类型就不是对象数组,而是对象,要将Object[]改为Object
        String hql="select s.name from Seller s"; //通过别名来引用持久化类的属性。

        Query query =session.createQuery(hql);

        List<Object> list=query.list(); //返回结果是对象

        for (Object objects : list) {
            System.out.println("name:"+objects); //在对象中的位置与选择属性顺序一致
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

控制台:
这里写图片描述


以Lisi集合形式返回查询的结果
在select子句中使用new list来指定返回查询结果
eg:

@Test
    public void testSelectClauseList(){ //通过select子句指定返回数据类型是List集合
        //通过new list来指定返回的数据类型是List集合形式
        String hql="select new list(s.name,s.tel,s.address) from Seller s";

        Query query=session.createQuery(hql);

        List<List> lists=query.list() ;//查询结果是List集合形式

        for (List list : lists) {
            System.out.println("name:"+list.get(0)); //索引信息就是在select子句中相应位置信息
            System.out.println("tel:"+list.get(1));
            System.out.println("address:"+list.get(2));
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

控制台:
这里写图片描述


通过Map返回查询结果
在select子句中使用new map指定查询结果的返回数据类型。在获取值时,map中的key值是属性在select子句中相应的索引值,它的类型是字符串类型。
map集合获得结果,除了通过序号获得属性信息,还可通过别名获取。
eg:

@Test
    public void testSelectClauseMap(){ //通过select子句指定返回数据类型是map形式
        //通过new map来指定返回数据类型是map类型
        String hql="select new map(s.name as name,s.tel as tel,s.address as address) from Seller s";        
        Query query=session.createQuery(hql);

        List<Map> maps=query.list(); //结果是map形式

        for (Map map : maps) {
            //key值就是属性在select子句中相应的位置信息,key值是字符串类型
            //map集合获得结果,除了通过序号获得属性信息,还可通过别名获取
            System.out.println("name:"+map.get("0")); 
            System.out.println("tel:"+map.get("1"));
            System.out.println("address:"+map.get("2"));
//          System.out.println("name:"+map.get("name"));
//          System.out.println("tel:"+map.get("tel"));
//          System.out.println("address:"+map.get("address"));
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

控制台:
这里写图片描述


通过自定义类型返回查询结果
在持久化类中定义相应的构造器,构造器的参数就是我们要选择返回的属性信息。然后在select子句中调用定义的构造器。
在Seller.java持久化类中增加构造器:

//定义一个构造器,参数是选择返回的属性信息
    public Seller(String name,String tel,String address){
        this.name=name;
        this.tel=tel;
        this.address=address;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

测试类SellerTest:

@Test
    public void testSelectClauseSelf(){ //select子句以自定义类型返回查询结果 
        //使用自定义类型来设置返回的数据类型
        String hql="select new Seller(s.name,s.tel,s.address) from Seller s";
        Query query=session.createQuery(hql);

        List<Seller> sellers=query.list(); //查询结果是Seller持久化类型
        for (Seller seller : sellers) {
            System.out.println("name:"+seller.getName());
            System.out.println("tel:"+seller.getTel());
            System.out.println("address:"+seller.getAddress());
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

控制台:
这里写图片描述


持久化类无参构造方法的重要性
当我们指定了构造器,hibernate框架就会调用我们选择的构造器;而未指定构造器时,hibernate就是调用默认构造器。


distinct关键字:去除查询结果中的重复元素
eg:select distinct sex from Customer c

@Test
    public void testDistinct(){ //测试distinct关键字
        String hql="select distinct c.sex from Customer c";
        Query query=session.createQuery(hql);
        List<Object> list=query.list(); //返回结果是对象

        for (Object object : list) {
            System.out.println(object);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

控制台(结果无重复元素):
这里写图片描述


猜你喜欢

转载自blog.csdn.net/budaoweng0609/article/details/79893794