发表于: 2017-11-12 17:31:41

1 878


一.今天完成的主要事情

1.继续学习Hibernate的相关知识

主要学习了Hibernate的HQL查询语句和QBC查询方式

HQL查询是一种类SQL查询,也是Hibernate官方推荐的查询方式,这种查询方式要求要对SQL语句比较熟悉

一个完整的的HQL查询语句包括select/update/delete...from...where...group by...order by desc/asc

from后面跟具体的类名,where后面可以跟各种sql表达式,HQL查询都是支持的

而且HQL支持更新/删除时直接操作,而不是先查询,再操作

比如:update User user set user.age=20 where user.age = 18,delete也是一样的

这样,提高了update和delete的性能,也避免了脏读的风险

2.在demo中实现用HQL执行更为复杂的操作

代码如下:


//根据page,size查询IdList

    public List<Long> queryUserIdsList(Integer page, Integer size) {

        Session session = sessionFactory.openSession();

        Query query = session.createQuery("select user.id from com.ptteng.hibernate.spring.demo.model.User user");

        //设置查询的结果集长度

        query.setFirstResult(page);

        query.setMaxResults(size);

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

        session.close();

        return list;

    }


    //根据IdList批量查询对象List

    public List<User> queryUserListByIds(List<Long> userIds) {

        Session session = sessionFactory.openSession();

        //创建sql,参数名绑定

        String sql = "select * from demo where id in (:id)";

        Map<String, List<Long>> map = new HashMap<String, List<Long>>();

        map.put("id", userIds);

        SQLQuery sqlQuery = session.createSQLQuery(sql).addEntity(User.class);

        if (map != null && map.size() > 0) {

            for (Map.Entry<String, List<Long>> entry : map.entrySet()) {

                sqlQuery.setParameterList(entry.getKey(), entry.getValue());

            }

        }

        return sqlQuery.list();

    }


    //根据cellphone字段获取IdList(条件查询)

    public List<Long> getUserIdsByCellphone(String cellphone, Integer page, Integer size) {

        Session session = sessionFactory.openSession();

        String hql = "select id from com.ptteng.hibernate.spring.demo.model.User where cellphone=?";

        Query query = session.createQuery(hql);

        //参数绑定,参数位置绑定

        query.setParameter(0, cellphone);

        query.setFirstResult(page);

        query.setMaxResults(size);

        return query.list();

    }


    //根据cellphone字段获取IdList,并且根据username倒序排序(条件查询带排序)

    public List<Long> getUserIdsByCellphoneAndOrderByUsername(String cellphone, Integer page, Integer size, String way) {

        Session session = sessionFactory.openSession();

        if (!way.equals("desc") && !way.equals("asc")){

            return null;

        }

        String hql = "select id from com.ptteng.hibernate.spring.demo.model.User where cellphone=? order by username " + way;

        Query query = session.createQuery(hql);

        //参数位置绑定

        query.setParameter(0, cellphone);

        query.setFirstResult(page);

        query.setMaxResults(size);

        return query.list();

    }


    //查询List中若干字段

    public List<Object[]> queryUserPartFieldList(List<String> parameters) {

        Session session = sessionFactory.openSession();

        String hql = "select ";

        for (int i = 0; i < parameters.size(); i++) {

            hql += parameters.get(i);

            if (i != parameters.size() - 1) {

                hql += ",";

            }

        }

        hql += " from com.ptteng.hibernate.spring.demo.model.User";

        List<Object[]> list = session.createQuery(hql).list();

        session.close();

        return list;

    }


HQL的参数绑定有多种方式:

第一,参数名绑定, 如(from User where username=:name), 设置参数时为query.setString(name, "zhangsan");

第二,参数位置绑定, 如(from User where username=? and cllphone=?),

设置参数时为query.setParameter(0, "zhangsan");query.setParameter(1, "13500000000");

第三,setParameter()方法,绑定任意类型的参数

如(from User where username=:name and cellphone=?)

设置参数为query.setParameter("username", name, Hibernate.STRING);

第四,setProperties()方法,绑定命名参数和对象属性

3.QBC查询方式

QBC是标准化查询方式,这种查询方式不用写任意一条sql语句就可以查询出数据,是完完全全的面向对象的思想实现.

它的优点是不用对sql语句有太多的了解,取点是比较繁琐,因为所有的参数都要通过参数拼装的方式拼接起来

所以,一般情况下,我们还是使用HQL方式查询

这种方式有两点好处,一是方便优化数据库性能,二是防止了sql注入

二.明天计划完成的事情

Hibernate到此一些基础的内容就算学完了,明天开始研究Struts2框架,等后续将这些框架的基础用法都掌握之后,再对这些框架进行深入的进一步的学习

三.遇到的问题

暂无

四.收获

以上

五.项目进度情况

现在后台已经完全写好了,就剩下前台的请求,应该快了吧



返回列表 返回列表
评论

    分享到