• sql,hql的写法


     1 public List getList(long id){
     2         String sql="select 字段 from 对象"+" where p.id="+id;
     3         Session sess=null;
     4         try{
     5             sess=this.getSession();
     6             SQLQuery q = sess.createSQLQuery(sql);
     7             return q.list();
     8         }finally{
     9             if(sess!=null){
    10                 this.releaseSession(sess);
    11             }
    12         }
    13     }
    public List getList(long id){
                String sql="select 字段 from 对象+ " where p.id="+id; 
            return this.getHibernateTemplate().find(sql); }
    public int delete(final long id) {
                Object obj = this.getHibernateTemplate().execute(
                             new HibernateCallback() {
                                   public Object doInHibernate(Session session)
                                               throws HibernateException, SQLException {
                      String hql = "delete 对象 where id=:id";
                      return new Integer(session.createQuery(hql).setLong( "id", id).executeUpdate());
                                  }
                            });
                 return ((Integer) obj).intValue();
          }
    HibernateCallback是回调函数,是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),
    这个方法体就是Spring执行的持久化操作。这里用到了(:id)这种别名的方式设置参数。(上面的函数,是用hirbernate的回调函数来删除id,因为类型是int,所以最后return的时候需要转换一下类型。)
       我们也可以用?的参数化方式:
    /**
                 * 查询中使用?,通过setParameter的方式可以防止sql注入
                 * jdbc的setParameter的下标从1开始,hql的下标从0开始
                 */
                List<Student> students = (List<Student>)session.createQuery("select xxx from 表 where aa like ?") .setParameter(0, "%王%") .list();
    1)同理update:
    public int update(final long fId,final long cId) {
            Object obj=this.getHibernateTemplate().execute(
                    new HibernateCallback(){
                        public Object doInHibernate(Session session) throws HibernateException, SQLException {
                            String hql = "update 对象 set"+
                                " bId="+cId+
                                " where bId="+fId;
                            Query q=session.createQuery(hql);
                            return new Integer(q.executeUpdate());
                        }
                    }
                );
            return ((Integer)obj).intValue();
        }        
    public List<?> getList(boolean justEnabled){
                String sql="from 对象 c";
                if(justEnabled){
                    sql=sql+" where c.enabled='Y'";
                }
                return this.getHibernateTemplate().find(sql);
            }

    2)同样update,可以用set方式传数据。

    public int updateTwo(final long id, final String a, final BigDecimal b) {
                Object obj = this.getHibernateTemplate().execute(
                             new HibernateCallback() {
                                   public Object doInHibernate(Session session) throws HibernateException, SQLException {
                                        String hql = "update C set a=:a,b=:b,where id = " +id;
                                         return new Integer(session.createQuery(hql)
                                              .setString( "a", a)
                                              .setBigDecimal( "b", b)
                                              .executeUpdate());
                                  }
                            });
                 return ((Integer) obj).intValue();
          }

    (此处的c为别名)

    ========

    补充一个方法findByNamedParam,这个方法根据参数类型,可以有多个写法。

    1.

     public User get(String str) {
            String sql= "from User  u" +
                " where u.boss = :str" +
                " and u.enabled='Y'"+
                " order by u.id";
            String[] paramNames= new String[]{"str" };
            Object[] values= new Object[]{str};
            List<?> list = this.getHibernateTemplate().findByNamedParam(sql,paramNames,values);
            if(list.isEmpty()){
                return null ;
            } else{
                return (User)list.get(0);
            }
        }

    2.

    String queryString = "select count(*) from bean.User u where u.name=:myName and u.password=:myPassword";
    
    String[] paramName= new String[]{"myName" "myPassword"};
    
    String[] value= new String[]{"admin" "123"};
    
    this.getHibernateTemplate().findByNamedParam(queryString paramName value);
    
    返回用户名为admin密码为123的User对象

    3.

    String queryString = "select count(*) from bean.User u where u.name=:myName";
    
    String paramName= "myName";
    
    String value= "admin";
    
    this.getHibernateTemplate().findByNamedParam(queryString paramName value);
    
    System.out.println(list.get(0));

    返回name为admin的User对象的条数

     补充:

    4.用in进行列表查询:

     List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.id in (:room) and stu.sex like :sex")
                                                    .setParameterList("room", new Integer[]{1, 2}).setParameter("sex", "%女%")
                                                    .list();

    5.分页查询:

    /**
                 * 通过setFirstResult(0).setMaxResults(10)可以设置分页查询,相当于offset和pagesize
                 */
                List<Student> stus = (List<Student>)session.createQuery("select stu from Student stu where stu.room.name like :room and sex like :sex")
                                                    .setParameter("room", "%计算机应用%").setParameter("sex", "%女%").setFirstResult(0).setMaxResults(10)
                                                    .list();
  • 相关阅读:
    Minimum Path Sum,最短路径问题,动态规划
    UniquePaths,UniquePaths2,路径问题。动态规划。
    LengthOfLastWord,字符串最后一个子串的长度
    间隔问题,合并间隔(merge interval),插入间隔(insert interval)
    矩阵螺旋遍历Spiral Matrix,Spiral Matrix2
    Centos 5.2 下配置 php 的 json 扩展
    一个睡五分钟等于六个钟头的方法
    js div 排除内部的点击事件 就是 冒泡的处理
    做微信开发 “人脉圈的” 总结
    YII 学习笔记
  • 原文地址:https://www.cnblogs.com/charles-kun/p/5466151.html
Copyright © 2020-2023  润新知