Hibernate hql 查询指定字段并获取结果集

1. 查询整个映射对象所有字段

Java代码  


   //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段    

           String hql = "from Users";    

           Query query = session.createQuery(hql);    

               

           List<Users> users = query.list();    

           for(Users user : users){    

               System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());    

           }    

       

    输出结果为:    

   name1 : password1 : 1    

   name2 : password2 : 2    

   name3 : password3 : 3    




2.查询单个字段

Java代码  


   //查询单个字段    

           String hql = " select name from Users";    

           Query query = session.createQuery(hql);    

               

           List<String> list = query.list();    

           for(String str : list){    

               System.out.println(str);    

           }    

   输出结果为:    

   name1    

   name2    

   name3    




3.查询其中几个字段


Java代码  


   //查询其中几个字段    

           String hql = " select name,passwd from Users";    

           Query query = session.createQuery(hql);    

           //默认查询出来的list里存放的是一个Object数组    

           List<Object[]> list = query.list();    

           for(Object[] object : list){    

               String name = (String)object[0];    

               String passwd = (String)object[1];    

                   

               System.out.println(name + " : " + passwd);    

           }    

   输出结果为:    

   name1 : password1    

   name2 : password2    

   name3 : password3    




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

引用

//查询其中几个字段,添加new list(),注意list里的l是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是List集合了  

       String hql = " select new list(name,passwd) from Users";  

       Query query = session.createQuery(hql);  

       //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是List集合了  

       List<List> list = query.list();  

       for(List user : list){  

           String name = (String)user.get(0);  

           String passwd = (String)user.get(1);  

             

           System.out.println(name + " : " + passwd);  

       }  

       /**

       输出结果为:

        name1 : password1

       name2 : password2

       name3 : password3

        */


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

Java代码  收藏代码


   //查询其中几个字段,添加new map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了    

           String hql = " select new map(name,passwd) from Users";    

           Query query = session.createQuery(hql);    

           //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了    

           List<Map> list = query.list();    

           for(Map user : list){    

               //一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3....,value是字段值    

               //如果将hql改为:String hql = " select new map(name as username,passwd as password) from Users";,那么key将不是字符串0,1,2...了,而是"username","password"了    

               String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形    

               String passwd = (String)user.get("1");    

                   

               System.out.println(name + " : " + passwd);    

           }    

           /**  

           输出结果为:  

            name1 : password1  

           name2 : password2  

           name3 : password3  

            */    



6.修改默认查询结果(query.list())不以Object[]数组形式返回,以Set形式返回,但是因为Set里是不允许有重复的元素,所以:username和password的值不能相同。只需将hql改为:String hql = " select new set(name,passwd) from Users";


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


自定义类:


Java代码


   package com.domain;    

       

   public class MyUser {    

       

       private String username;    

       private String password;    

   //因为:String hql = " select new  com.domain.MyUser(name,passwd) from Users";所以必须要有接受2个参数的构造函数    

       public MyUser(String username,String password){    

           this.username = username;    

           this.password = password;    

       }    

           

       public String getUsername() {    

           return username;    

       }    

       public void setUsername(String username) {    

           this.username = username;    

       }    

       public String getPassword() {    

           return password;    

       }    

       public void setPassword(String password) {    

           this.password = password;    

       }    

           

           

   }    





Java代码


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

           String hql = " select new  com.domain.MyUser(name,passwd) from Users";    

           Query query = session.createQuery(hql);    

           //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是MyUser对象了    

           List<MyUser> myUsers = query.list();    

           for(MyUser myUser : myUsers){    

               String name = myUser.getUsername();    

               String passwd = myUser.getPassword();    

               System.out.println(name + " : " + passwd);    

           }    

           /**  

           输出结果为:  

           name1 : password1  

           name2 : password2  

           name3 : password3  

            */    




8:条件查询

Java代码


   //条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数    

           String hql = "from Users where name=? and passwd=?";    

           Query query = session.createQuery(hql);    

           //第1种方式    

   //      query.setString(0, "name1");    

   //      query.setString(1, "password1");    

           //第2种方式    

           query.setParameter(0, "name1",Hibernate.STRING);    

           query.setParameter(1, "password1",Hibernate.STRING);    

           List<Users> list = query.list();    

           for(Users users : list){    

               System.out.println(users.getId());    

           }    


       

Java代码


   //条件查询,自定义索引名(参数名):username,:password.通过setString,setParameter设置参数    

           String hql = "from Users where name=:username and passwd=:password";    

           Query query = session.createQuery(hql);    

           //第1种方式    

   //      query.setString("username", "name1");    

   //      query.setString("password", "password1");    

           //第2种方式,第3个参数确定类型    

           query.setParameter("username", "name1",Hibernate.STRING);    

           query.setParameter("password", "password1",Hibernate.STRING);    

           List<Users> list = query.list();    

           for(Users users : list){    

               System.out.println(users.getId());    

           }    

还有一种属于sql方式,但是可以转化过来entity

相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已。我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的。 
     例如现在有两张表,一张是user表,放了一些用户的信息,另外一张表是用户发表的帖子,里边有一个user的外键。我们需要查询出来,某个人发布的帖子,sql如下:

Java代码   收藏代码
  1. select u.userName,p.title,p.addTime from user as u,post as p where u.id=p.userId  


但是我们的POJO映射仅仅是做了user,post表的映射,这个时候,我们需要写一个PostVO类,里边放着了用户的信息和帖子的信息的属性,设置get\set方法,务必保证这个类里边有一个默认的构造函数。 
然后我们开始写这个数据库操作的dao,代码如下:

Java代码   收藏代码
  1. String sql = "select u.userName as <span style="color: #ff0000;">userName </span><span style="color: #000000;">,</span>p.title as <span style="color: #ff0000;">title </span>,p.addTime as <span style="color: #ff0000;">addTime</span> from user as u,post as p where u.id=p.userId"  
  2. Query q = factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));  


红字部分必须跟PostVO中的属性一直,这样就可以返回一个针对PostVO的一个集合。 

其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。 
如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成

Java代码   收藏代码
  1. setResultTransformer(new VOResultTransformer(PostVO.class));  


即可。


Java代码


   //条件查询,通过setProperties设置参数    

           String hql = "from Users where name=:username and passwd=:password";    

           Query query = session.createQuery(hql);    

           //MyUser类的2个属性必须和:username和:password对应    

           MyUser myUser = new MyUser("name1","password1");    

           query.setProperties(myUser);    

           List<Users> list = query.list();    

           for(Users users : list){    

               System.out.println(users.getId());    

           }  


[java] view plaincopy


   package com.hp.ts.bca.user.bo;  

     

   import com.hp.ts.bca.common.BaseObject;  

     

   public class StationUser  extends BaseObject {  

       private static final long serialVersionUID = -1175811459644997844L;  

       private int id;  

       private String username;  

       private String officePhone;  

       private String mobilePhone1;  

       private String officeEmail;  

       private Integer ifDefault;  

       public StationUser(int id, String username, String officePhone,  

               String mobilePhone1, String officeEmail, Integer ifDefault) {  

           super();  

           this.id = id;  

           this.username = username;  

           this.officePhone = officePhone;  

           this.mobilePhone1 = mobilePhone1;  

           this.officeEmail = officeEmail;  

           this.ifDefault = ifDefault;  

       }  

       public int getId() {  

           return id;  

       }  

       public void setId(int id) {  

           this.id = id;  

       }  

       public String getUsername() {  

           return username;  

       }  

       public void setUsername(String username) {  

           this.username = username;  

       }  

       public String getOfficePhone() {  

           return officePhone;  

       }  

       public void setOfficePhone(String officePhone) {  

           this.officePhone = officePhone;  

       }  

       public String getMobilePhone1() {  

           return mobilePhone1;  

       }  

       public void setMobilePhone1(String mobilePhone1) {  

           this.mobilePhone1 = mobilePhone1;  

       }  

       public String getOfficeEmail() {  

           return officeEmail;  

       }  

       public void setOfficeEmail(String officeEmail) {  

           this.officeEmail = officeEmail;  

       }  

       public Integer getIfDefault() {  

           return ifDefault;  

       }  

       public void setIfDefault(Integer ifDefault) {  

           if(ifDefault==null)  

               ifDefault=0;  

           else  

               this.ifDefault = ifDefault;  

       }  

       @Override  

       public int hashCode() {  

           final int prime = 31;  

           int result = 1;  

           result = prime * result + id;  

           result = prime * result  

                   + ((ifDefault == null) ? 0 : ifDefault.hashCode());  

           result = prime * result  

                   + ((mobilePhone1 == null) ? 0 : mobilePhone1.hashCode());  

           result = prime * result  

                   + ((officeEmail == null) ? 0 : officeEmail.hashCode());  

           result = prime * result  

                   + ((officePhone == null) ? 0 : officePhone.hashCode());  

           result = prime * result  

                   + ((username == null) ? 0 : username.hashCode());  

           return result;  

       }  

       @Override  

       public boolean equals(Object obj) {  

           if (this == obj)  

               return true;  

           if (obj == null)  

               return false;  

           if (getClass() != obj.getClass())  

               return false;  

           StationUser other = (StationUser) obj;  

           if (id != other.id)  

               return false;  

           if (ifDefault == null) {  

               if (other.ifDefault != null)  

                   return false;  

           } else if (!ifDefault.equals(other.ifDefault))  

               return false;  

           if (mobilePhone1 == null) {  

               if (other.mobilePhone1 != null)  

                   return false;  

           } else if (!mobilePhone1.equals(other.mobilePhone1))  

               return false;  

           if (officeEmail == null) {  

               if (other.officeEmail != null)  

                   return false;  

           } else if (!officeEmail.equals(other.officeEmail))  

               return false;  

           if (officePhone == null) {  

               if (other.officePhone != null)  

                   return false;  

           } else if (!officePhone.equals(other.officePhone))  

               return false;  

           if (username == null) {  

               if (other.username != null)  

                   return false;  

           } else if (!username.equals(other.username))  

               return false;  

           return true;  

       }  

       @Override  

       public String toString() {  

           return "StationUser [id=" + id + ", username=" + username  

                   + ", officePhone=" + officePhone + ", mobilePhone1="  

                   + mobilePhone1 + ", officeEmail=" + officeEmail  

                   + ", ifDefault=" + ifDefault + "]";  

       }  

         

         

     

     

     

   }  



[java] view plaincopy


   @Override  

       public PageResponse<User> getUserListByStationId(int currentPage,  

               int rowsPerPage, String sidx, String sord, Integer stationId) {  

           StringBuilder hql = new StringBuilder();  

           hql.append("select new com.hp.ts.bca.user.bo.StationUser(a.id,a.username,a.officePhone,a.mobilePhone1,a.officeEmail,ug.ifDefault) FROM User a, UserGroup ug WHERE a.id=ug.userId and ug.groupId=");  

           hql.append(stationId);  

           //hql.append("FROM User AS user, UserGroup AS ug WHERE user.id=ug.userId");  

           PageResponse<User> userList = this.groupDao.excutePage(hql.toString(),  

                   currentPage, rowsPerPage, sidx, sord);  

           return userList;  

       }  

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值