• hibernate sql查询


    如果你跟我一样比较熟悉SQL,同时不想学习一门新的语言。那么在hibernate中使用Native SQL 查询也是一种不错的方式。

    • 一方面,Native SQL在效率方面有天生的优势;
    • 另一方面,SQL是数据库操作的一种标准,我们与程序、数据库关联很小。如果将来不用hibernate,而是用别的ORM,sql一样好用。

    但尽量用标准SQL,而不要用过多方言SQL。

    标量查询

    最基本的 SQL 查询就是获得一个标量(数值)的列表。

    sess.createSQLQuery("SELECT * FROM USER").list();
    sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM USER").list();

    它们都将返回一个 Object 数组(Object[])组成的 List,数组每个元素都是 USER 表的一个字段值。Hibernate 会使用 ResultSetMetadata 来判定返回的标量值的实际顺序和类型。

    如果不需要在后台进行复杂的处理,可直接将list<Object[]> 转化为json,交给前台去处理。在处理json时,按照数组的方式遍历一个item的属性,属性值为空对应null。

    例如我们前台需要一个json格式的包含userName,address,phone的UserInfo列表,而并不需要account、password等隐私信息。

        public List<Object> findUserInfo(){
            Session session=HibernateUtil.currentSession();
            Transaction tx = null;
            List<Object> infolist=null;
            try {
                tx=session.beginTransaction();
                Query query=session.createSQLQuery("select userName,address,phone from user");
                infolist=query.list();
                tx.commit();
            } catch (HibernateException e) {
                throw e;
            }
            return infolist;
        }

    实体查询

    上面的查询都是返回标量值的,也就是从 resultset 中返回的“裸”数据。下面展示如何通过

    addEntity() 让原生查询返回实体对象。

    sess.createSQLQuery("SELECT * FROM USER").addEntity(User.class);
    sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM USER").addEntity(User.class);

    这个查询指定:

    • SQL 查询字符串
    • 要返回的实体

    返回单个实体

    根据id查询实体:

        public User getById(Integer id) {
            Session session=HibernateUtil.currentSession();
            Transaction tx = null;
            User user=null;
            try {
                tx=session.beginTransaction();
                user=(User) session.get(User.class, id);
                tx.commit();
            } catch (HibernateException e) {
                tx.rollback();
                throw e;
            }
            return user;
        }

    根据unique属性查询实体:

        public User findUniqueByProperty(String propertyName,String value) {
            Session session=HibernateUtil.currentSession();
            Transaction tx = null;
            User user = null;
            try {
                tx=session.beginTransaction();
                Query query=session.createQuery("from User where "+propertyName+"=?");
                query.setString(0, value);
                user=(User)query.uniqueResult();
                tx.commit();
            } catch (HibernateException e) {
                tx.rollback();
                throw e;
            }
            return user;
        }

    返回一个集合

        public List<User> findAll() {
            Session session=HibernateUtil.currentSession();
            Transaction tx = null;
            List<User> userlist=null;
            try {
                tx=session.beginTransaction();
                Query query=session.createSQLQuery("select * from user").addEntity(User.class);
                userlist=query.list();
                tx.commit();
            } catch (HibernateException e) {
                tx.rollback();
                throw e;
            }
            return userlist;
        }
    
    

    分页查询

    如果你需要指定结果集的范围(希望返回的最大行数/或开始的行数),分别应该使用 Query 接口提供的方法:setFirstResult(int firstResult)、setMaxResults(int maxResults)。

    分页查询是这种应用的一个特殊情况,一页代表从数据库某一行开始到某一行结束的结果集。

    Query query=session.createSQLQuery("SELECT * FROM USER");
    query.setFirstResult((pageIndex - 1) * pageSize);//结果集的起始行
    query.setMaxResults(pageSize); //结果集的最大记录数,也就是一页的记录数

    下面是一个实例:

        public List<LogDetail> pageQuery(int pageIndex, int pageSize, int adminId) {
            Session session = HibernateUtil.currentSession();
            Transaction tx = null;
            List<LogDetail> logDetailList = null;
            try {
                tx = session.beginTransaction();
                Query query = session
                        .createSQLQuery(
                                "select logdetail.* from logdetail INNER JOIN useradmin on logdetail.userId=useradmin.userId "
                                        + "where adminId=" + adminId +" order by logDate desc")
                                        .addEntity(LogDetail.class);
                query.setFirstResult((pageIndex - 1) * pageSize);
                query.setMaxResults(pageSize);
                logDetailList = query.list();
                tx.commit();
            } catch (HibernateException e) {
                tx.rollback();
                throw e;
            }
            return logDetailList;
        }
  • 相关阅读:
    POJ3297+map字符串处理
    POJ3204+DInic+maxflow
    HDU4704+费马小定理
    FZU-1924+判断环/DFS/BFS
    FZU-1921+线段树
    FZU-1926+KMP
    CodeForce 339:A+B+C
    HDU2896+AC自动机
    POJ2527+多项式除法
    鼠标移入移出事件
  • 原文地址:https://www.cnblogs.com/klguang/p/4872605.html
Copyright © 2020-2023  润新知