夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          以個普通Users表為例:
          建表語句:
          CREATE DATABASE `interceptor`
          CHARACTER SET 'utf8';
          USE `interceptor`;
          DROP TABLE IF EXISTS `users`;

          create table users(
          id int auto_increment primary key,
          name varchar(10) not null,
          passwd varchar(10) not null
          )
          ENGINE=InnoDB DEFAULT CHARSET=utf8;
          User.java:
          package com.domain;
          public class Users implements java.io.Serializable {
          private Integer id;
          private String name;
          private String passwd;
          public Users() {
          }
          public Users(String name, String passwd) {
          this.name = name;
          this.passwd = passwd;
          }
          public Integer getId() {
          return this.id;
          }
          public void setId(Integer id) {
          this.id = id;
          }
          public String getName() {
          return this.name;
          }
          public void setName(String name) {
          this.name = name;
          }
          public String getPasswd() {
          return this.passwd;
          }
          public void setPasswd(String passwd) {
          this.passwd = passwd;
          }
          User.hbm.xml:

          <?xml version="1.0" encoding="utf-8"?>
          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
          <hibernate-mapping>
          <class name="com.domain.Users" table="users" catalog="interceptor">
          <id name="id" type="java.lang.Integer">
          <column name="id" />
          <generator class="native" />
          </id>
          <property name="name" type="java.lang.String">
          <column name="name" length="10" not-null="true" />
          </property>
          <property name="passwd" type="java.lang.String">
          <column name="passwd" length="10" not-null="true" />
          </property>
          </class>
          </hibernate-mapping>
          1. 查詢整個映射對象所有字段
          //直接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.查詢單個字段
          //查詢單個字段

          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.查詢其中幾個字段
          //查詢其中幾個字段

          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形式返回
          //查詢其中幾個字段,添加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[]數組形式返回,以自定義類型返回
          自定義類:
          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;
          }
          }


          //通過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:條件查詢
          //條件查詢,參數索引值從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());
          }
          //條件查詢,自定義索引名(參數名):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){
          out.println(users.getId());
          }

          //條件查詢,通過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());
          }

          posted on 2008-11-12 14:23 HUIKK 閱讀(4311) 評論(2)  編輯  收藏 所屬分類: Hibernate

          評論

          # re: HQL 總結 2011-06-13 16:03 RE:HQL總結 小結 算法
          1
            回復  更多評論
            

          # re: HQL 總結 2011-08-11 16:18 zw
          寫的不錯,很詳細。
          支持!  回復  更多評論
            

          主站蜘蛛池模板: 古丈县| 南川市| 黄浦区| 正镶白旗| 清苑县| 新野县| 彝良县| 新闻| 东港市| 颍上县| 焦作市| 福州市| 北宁市| 宜兰市| 乌苏市| 江油市| 古丈县| 乾安县| 庆城县| 仙桃市| 栾城县| 新邵县| 准格尔旗| 宜川县| 平昌县| 赣榆县| 兴仁县| 永康市| 永兴县| 安平县| 无为县| 潜江市| 平利县| 顺义区| 东山县| 石棉县| 错那县| 理塘县| 老河口市| 个旧市| 珠海市|