hibernate中只选取某些列的写法

来源:互联网 发布:广东省地名地址数据库 编辑:程序博客网 时间:2024/06/05 23:44

  在普通的sql中,为了选取某些列,其实是很简单的,就select 列名就可以了,但在hibernate中,一般都是sql="from user ....";但这样其实某些时候,效率还是很低的,在hibernate做的时候,要这样了,如下:

[java] view plaincopy
  1. String hql = "select new map(t.title as title,t.id as id,t.link as link,t.linktitle as linktitle) from Article as t  where t.category="  
  2.                 + categoryid + " order by t.uploadtime desc";  
  3.         Query query = getSessionFactory().getCurrentSession().createQuery(hql);  
  4.         query.setFirstResult((pageNo - 1) * pageSize);  
  5.         query.setMaxResults(pageSize);  
  6.         List<Map> list = query.list();  
  7.         for (Map article : list) {  
  8.             String title = (String) article.get("title");  
  9.             System.out.println("文章标题是" + title);  
  10.         }  

 

下面再介绍下相关的知识:

1、 查询其中几个字段

[java] view plaincopy
  1. String hql = " select name,passwd from Users";  
  2.         Query query = session.createQuery(hql);  
  3.         // 默认查询出来的list里存放的是一个Object数组  
  4.         List<Object[]> list = query.list();  
  5.         for (Object[] object : list) {  
  6.             String name = (String) object[0];  
  7.             String passwd = (String) object[1];  
  8.             System.out.println(name + " : " + passwd);  
  9.         }  

2、修改默认查询结果(query.list())不以Object[]数组形式返回,以List形式返回

[java] view plaincopy
  1. // 查询其中几个字段,添加new  
  2.         // list(),注意list里的l是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是List集合了  
  3.         String hql = " select new list(name,passwd) from Users";  
  4.         Query query = session.createQuery(hql);  
  5.         // 默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是List集合了  
  6.         List<List> list = query.list();  
  7.         for (List user : list) {  
  8.             String name = (String) user.get(0);  
  9.             String passwd = (String) user.get(1);  
  10.             System.out.println(name + " : " + passwd);  
  11.         }  

 3、要注意的是,假如这时有些列是为空的话,则String hql =   "  select new list(name,passwd) from Users " ;    是会报错的,要用下面的方法:

[java] view plaincopy
  1. // 查询其中几个字段,添加new  
  2.         // map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了  
  3.         String hql = " select new map(name,passwd) from Users";  
  4.         Query query = session.createQuery(hql);  
  5.         // 默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了  
  6.         List<Map> list = query.list();  
  7.         for (Map user : list) {  
  8.             // 一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3.,value是字段值  
  9.             // 如果将hql改为:String hql = " select new map(name as username,passwd as  
  10.             // password) from Users";,那么key将不是字符串0,1,2了,而是"username","password"了  
  11.             String name = (String) user.get("0");// get("0");是get(key),注意:0,1,2是字符串,而不是整形  
  12.             String passwd = (String) user.get("1");  
  13.             System.out.println(name + " : " + passwd);  
  14.         }  


4、修改默认查询结果(query.list())不以Object[]数组形式返回,以自定义类型返回

 

[java] view plaincopy
  1. package com.domain;     
  2.     
  3. public class MyUser {     
  4.     private String username;     
  5.     private String password;     
  6. //因为:String hql = " select new  com.domain.MyUser(name,passwd) from Users";所以必须要有接受2个参数的构造函数     
  7.     public MyUser(String username,String password){     
  8.         this.username = username;     
  9.         this.password = password;     
  10.     }     
  11.          
  12.     public String getUsername() {     
  13.         return username;     
  14.     }     
  15.     public void setUsername(String username) {     
  16.         this.username = username;     
  17.     }     
  18.     public String getPassword() {     
  19.         return password;     
  20.     }     
  21.     public void setPassword(String password) {     
  22.         this.password = password;     
  23.     }     
  24.          
  25.          
  26. }    

     通过query.list()出来的list里存放的不再是默认的 Object数组了,而是自定义的类MyUser,必须加包名,String hql = "from Users";中的Users类也是必须加包名的,但是因为再Users.hbm.xml里<hibernate-mapping auto-import="true"> auto- import默认值为true(所以auto-import属性也可以不写),自动导入了。

[java] view plaincopy
  1. String hql = " select new  com.domain.MyUser(name,passwd) from Users";  
  2.         Query query = session.createQuery(hql);  
  3.         // 默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是MyUser对象了  
  4.         List<MyUser> myUsers = query.list();  
  5.         for (MyUser myUser : myUsers) {  
  6.             String name = myUser.getUsername();  
  7.             String passwd = myUser.getPassword();  
  8.             System.out.println(name + " : " + passwd);  
  9.         }  

5、 条件查询

[c-sharp] view plaincopy
  1. // 条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数  
  2.         String hql = "from Users where name=? and passwd=?";  
  3.         Query query = session.createQuery(hql);  
  4.         // 第1种方式  
  5.         // query.setString(0, "name1");  
  6.         // query.setString(1, "password1");  
  7.         // 第2种方式  
  8.         query.setParameter(0, "name1", Hibernate.STRING);  
  9.         query.setParameter(1, "password1", Hibernate.STRING);  
  10.         List<Users> list = query.list();  
  11.         for (Users users : list) {  
  12.             System.out.println(users.getId());  
  13.         }  

[c-sharp] view plaincopy
  1. // 条件查询,自定义索引名(参数名):username,:password.通过setString,setParameter设置参数  
  2.         String hql = "from Users where name=:username and passwd=:password";  
  3.         Query query = session.createQuery(hql);  
  4.         // 第1种方式  
  5.         // query.setString("username", "name1");  
  6.         // query.setString("password", "password1");  
  7.         // 第2种方式,第3个参数确定类型  
  8.         query.setParameter("username""name1", Hibernate.STRING);  
  9.         query.setParameter("password""password1", Hibernate.STRING);  
  10.         List<Users> list = query.list();  
  11.         for (Users users : list) {  
  12.             System.out.println(users.getId());  
  13.         }  

[c-sharp] view plaincopy
  1. // 条件查询,通过setProperties设置参数  
  2.         String hql = "from Users where name=:username and passwd=:password";  
  3.         Query query = session.createQuery(hql);  
  4.         // MyUser类的2个属性必须和:username和:password对应  
  5.         MyUser myUser = new MyUser("name1""password1");  
  6.         query.setProperties(myUser);  
  7.         List<Users> list = query.list();  
  8.         for (Users users : list) {  
  9.             System.out.println(users.getId());  
  10.         }  

      假如觉得还是想用回原生SQL的话,可以这样: 

[javascript] view plaincopy
  1. Query query = getSessionFactory().getCurrentSession().createSQLQuery(  
  2.             hql).addScalar("title", Hibernate.STRING).addScalar("id",  
  3.             Hibernate.INTEGER).setResultTransformer(  
  4.             Transformers.aliasToBean(Article.class));  

      就是要注意的话,这里的createSQLQuery里面跟的是原生的sql,要读什么属性,就要不断加addScalar,个人觉得这个方式十分麻烦。