以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]);
}
}
控制台:
特:当只查询持久化类的一个属性时,返回的结果就是对象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); //在对象中的位置与选择属性顺序一致
}
}
控制台:
以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));
}
}
控制台:
通过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"));
}
}
控制台:
通过自定义类型返回查询结果:
在持久化类中定义相应的构造器,构造器的参数就是我们要选择返回的属性信息。然后在select子句中调用定义的构造器。
在Seller.java持久化类中增加构造器:
//定义一个构造器,参数是选择返回的属性信息
public Seller(String name,String tel,String address){
this.name=name;
this.tel=tel;
this.address=address;
}
测试类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());
}
}
控制台:
持久化类无参构造方法的重要性:
当我们指定了构造器,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);
}
}
控制台(结果无重复元素):